Sự cố hàng xóm gần nhất trong Postgis 2.0 khi sử dụng chỉ số GIST (chức năng <->)


25

Tôi đang cố gắng sử dụng hàm mới Postgis 2.0 <-> (Geometry distance Centroid) để tính toán, cho mỗi hàng của bảng của tôi (cosn1), khoảng cách đến đa giác gần nhất của cùng một lớp.

Tôi đã cố gắng sử dụng mã sau đây:

WITH index_query AS (
  SELECT g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN    
    FROM "cosn1" As g1, "cosn1" As g2   
    WHERE g1.gid <> g2.gid AND g1.class = g2.class
    ORDER BY g1.gid, g1.the_geom <-> g2.the_geom) 
SELECT DISTINCT ON (ref_gid) ref_gid, ENN 
    FROM index_query
ORDER BY ref_gid, ENN;

Nhưng sau đó tôi nhận ra cảnh báo:

Lưu ý: Chỉ mục chỉ khởi động nếu một trong các hình học là một hằng số (không phải trong truy vấn con / cte). ví dụ: 'SRID = 3005; POINT (1011102 450541)' :: hình học thay vì a.geom

Có nghĩa là Index hoàn toàn không được sử dụng và truy vấn sẽ mất gần như cùng thời gian như trước khi sử dụng:

SELECT DISTINCT ON(g1.gid)  g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN    
    FROM "cosn1" As g1, "cosn1" As g2   
    WHERE g1.gid <> g2.gid AND g1.class = g2.class
    ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)

Bất cứ ai có thể chỉ cho tôi một cách giải quyết cho phép tôi cải thiện hiệu suất truy vấn của mình không?

Cảm ơn nhiều.


Chưa có câu trả lời nào, bạn có thể muốn hỏi điều này trong danh sách gửi thư của PostGIS.
GIS-Jonathan

Tôi đã làm, nhưng cũng không có bất kỳ phản hồi.
Alexandre Neto

3
Bạn có thể sử dụng g1.gid> g2.gid trong mệnh đề where, điều này sẽ làm giảm số lượng tính toán khoảng cách bạn phải làm. Thật không may, cho đến khi toán tử <-> hoạt động mà không có hằng số, chúng ta sẽ không thấy nhiều cải thiện tốc độ trong loại truy vấn này.
John Powell

John, tôi cần giữ tất cả các gids, ngay cả những gids được lặp lại khi tôi cần cập nhật EEN cho mỗi một đa giác trong bảng "cosn1" của tôi. Nhưng những gì bạn nói đã cho tôi một ý tưởng. Tôi có thể làm như bạn nói bằng cách sử dụng g1.gid> g2.gis để giảm các phép tính khoảng cách, nhưng vẫn giữ g1.gid và g2.gid trong kết quả. Sau đó, tôi có thể hợp nhất hai truy vấn con của nó (một với g1.gis là gid và một với g2.gid). Cảm ơn
Alexandre Neto

Tôi thấy rằng một giải pháp khả thi để giải quyết vấn đề không đổi sẽ là sử dụng <-> bên trong Hàm SQL, sử dụng the_geom làm tham số. Tôi đã thực hiện một số thử nghiệm và trong một số trường hợp, nó nhanh hơn nhiều (). Nhưng trong trường hợp của tôi, vì khoảng cách nằm trong cùng một bảng, nhiều phép tính khoảng cách được lặp lại trong quá trình, làm cho nó chậm hơn so với sử dụng truy vấn trực tiếp.
Alexandre Neto

Câu trả lời:


2

Hum làm một số thử nghiệm trên máy của tôi nghe có vẻ như toán tử này <-> không hoạt động đúng. Tôi không chắc chắn đó là một lỗi nhưng nó báo cáo khoảng cách bằng không trên hình học không chồng chéo. Có hấp dẫn không?

Vâng, những gì về tối ưu hóa truy vấn SQL truyền thống công bằng? Vì những kết quả không mong muốn với toán tử <-> tôi thay thế nó bằng st_centroid. Có kết quả tốt hơn nhiều về tốc độ.

Hy vọng ngữ nghĩa với st_overlaps giữ nguyên. Ít nhất điều này tôi đã hiểu từ tài liệu về <->

Từ tài liệu trên Postigs <->

Đối với các loại hình học khác, khoảng cách giữa các tâm của khung giới hạn dấu phẩy động được trả về.

Trên dữ liệu thử nghiệm của tôi với ~ 5,5k đa giác đã tăng tốc từ ~ 1000 giây lên ~ 5 giây mà không cần lập chỉ mục không gian.

Dù sao tại sao sử dụng DISTINCT ON để làm nhóm? Tôi thấy một số người sử dụng nó nhưng không tồn tại nhóm để loại bỏ trùng lặp?

Truy vấn của bạn với tối ưu hóa SQL tiêu chuẩn mà không có lỗi st_centroid được giới thiệu

select g1.gid, min( st_distance( g1.the_geom, g2.the_geom ) ) AS enn
FROM 
  "cosn1" AS g1, "cosn1" AS g2
WHERE
  g1.gid <> g2.gid
  AND g1.class = g2.class
  AND g1.the_geom && g2.the_geom
GROUP BY
  g1.gid

Chúc mừng giáng sinh


Xin lỗi nhưng câu trả lời của bạn không giải quyết được vấn đề. Thực tế nó nhanh hơn nhiều, nhưng kết quả không chính xác, vì kết quả cuối cùng được tính bằng cách sử dụng các đa giác của đa giác, thay vì hình học thực của chúng. <-> nhằm tối ưu hóa việc tìm kiếm ứng viên cho người hàng xóm gần nhất nhưng cuối cùng nên sử dụng hình học thực để tính khoảng cách đến ứng viên tốt nhất. Tôi cũng đã thử sử dụng MIN \ GROUP BY thay vì DISTINCT ON \ ORDER BY, và nó dường như chậm hơn.
Alexandre Neto

Nhưng hướng dẫn sử dụng postgis cho toán tử <-> nói rằng nó sử dụng centroid cho hình học không điểm. Vì vậy, giải pháp của tôi sẽ cung cấp cho bạn kết quả tương tự. Nó sẽ cung cấp cho bạn kết quả tương tự như truy vấn hàng đầu của bạn. Vui lòng kiểm tra xem kết quả với toán tử <-> cũng đúng. Nó báo cáo cho tôi hình học có độ dài bằng không trên dữ liệu thử nghiệm của tôi để kết quả của nó có thể bị phá vỡ và giải pháp này cho dữ liệu chính xác hơn. Nếu bạn có thể đăng một số hồ sơ mẫu hiển thị lỗi tại một số trang web pastie, chúng tôi có thể phát hiện ra lỗ hổng trên giải pháp.
cavila

Nếu bạn kiểm tra truy vấn của tôi, toán tử <-> sẽ chỉ được sử dụng để đặt hàng cho các ứng cử viên, kết quả cuối cùng được tính bằng hình học thực tế. Dù sao, như tôi đã nói trước đây, <-> tăng hiệu suất chỉ hoạt động với các điểm cố định. Đó là câu hỏi ban đầu của tôi.
Alexandre Neto

Vì vậy, bạn có đồng ý rằng truy vấn hàng đầu không tương đương với truy vấn dưới cùng? Vì thứ tự sẽ thay đổi bởi vì toán tử <-> sẽ ORDER BY st_centroid và st_distance sẽ cung cấp cho bạn một giá trị khác? Thứ tự khác nhau có thể mang lại một truy vấn khác nhau khi hàng đầu tiên chuyển qua mệnh đề DISTINCT ON? Các truy vấn hợp lệ sẽ là một trong những cần phải cải thiện tốc độ?
cavila

Có, truy vấn đầu tiên là một ý định để cải thiện tốc độ ở phía dưới. Và vâng, nó có thể cho một kết quả khác một chút, vì g1.geom <-> g2.geom sử dụng trọng tâm và điều đó có nghĩa là hàng đầu tiên có thể không gần hơn. Để làm cho nó hoạt động, tôi tin rằng tôi sẽ phải đặt một giới hạn cho thứ tự theo mệnh đề nói giới hạn 10 sau đó trích xuất các giá trị thực của khoảng cách. Thậm chí có thể sử dụng <#> thay vào đó, sử dụng các hộp giới hạn thay vì các tâm.
Alexandre Neto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.