2012-07-01 61 views
5

Tôi có hai bảng mà tôi muốn giao nhau. Bảng đầu tiên đại diện cho khoảng 50 triệu điểm và thứ hai là một lớp đa giác của tất cả các quốc gia trên thế giới. Tôi muốn lấy tất cả các điểm giao nhau với đa giác đó.Truy vấn không gian Postgresql quá chậm

SELECT d.id, d.geom 
FROM export d, world_boundaries b 
WHERE (b.cntry_name = 'UK') 
    AND d.date_inserted >= '2012-06-01' 
    AND d.geom && b.wkb_geometry 
    AND intersects(d.geom, b.wkb_geometry); 

Truy vấn này rất đơn giản nhưng phải mất hơn 4 giờ để chạy. Tôi có chỉ số GIST được xây dựng trên cột hình học cho mỗi bảng và có VACUUM ANALYZE'd cả hai. Vẫn không tăng hiệu suất. Tôi đang chạy CENTOS 6 với Postgres 8.4 và PostGIS 1.5. Bất cứ ai có thể làm sáng tỏ một số cách để tăng tốc độ? Tôi nhận được kết quả rất nhanh khi giới hạn truy vấn từ 1000 đến 10000 bản ghi. Khi tôi cố gắng lấy kết quả đầy đủ, nó sẽ kéo. Suy nghĩ?

CẬP NHẬT: Tôi thấy bây giờ tôi phải tinh chỉnh truy vấn của mình là bước đầu tiên trong quy trình này. Tôi nhận phong bì như thế này

select astext(st_envelope(wkb_geometry)) as e 
from world_borders 
where cntry_name = 'UK' 

Bây giờ, cách hiệu quả nhất để bao gồm/thực hiện điều này như một phần của toàn bộ truy vấn là gì?

+1

Mỗi bản phát hành gần đây đã cải thiện chỉ mục GiST và GIN. Bạn có thể muốn xem xét nâng cấp lên bản phát hành chính mới. Nó thậm chí có thể là giá trị cố gắng vấn đề của bạn trên bản phát hành 9,2 beta, kể từ khi nó bao gồm SP-GiST. http://www.postgresql.org/docs/9.2/static/spgist-intro.html – kgrittn

Trả lời

1

Hãy thử chạy nó bằng EXPLAIN (và LIMIT) để xem liệu các chỉ mục có đang được sử dụng hay không.

Vì kiểm tra giao lộ thực là hoạt động chậm nhất ở đó, có thể chạy nó với một số ST_Collect của truy vấn phụ (mọi thứ trừ kiểm tra ST_Intersects) sẽ giúp ích. Bằng cách đó sẽ chỉ có một cuộc gọi và nếu việc xây dựng đa kết quả đủ nhanh, kết quả thực có thể tốt hơn.

edit1: Vâng, hóa ra nó không phải là quá tối ưu, vì trừ khi bạn buộc các tọa độ để 3ngày (để giữ cũng là id), một tra cứu thêm là cần thiết để có được id hình học:

SELECT d.id, d.geom 
FROM 
(
    SELECT * 
    FROM 
    ( 
     SELECT ST_Collect(d.geom) 
     FROM export d, world_boundaries b 
     WHERE (b.cntry_name = 'UK') 
     AND d.date_inserted >= '2012-06-01' 
     AND d.geom && b.wkb_geometry 
    ) as c, world_boundaries b 
    WHERE (b.cntry_name = 'UK') 
    AND ST_Intersection(c.geom, b.wkb_geometry); 
) as e, export d 
WHERE (ST_Dump(e.geom)).geom = d.geom 
+2

Đừng mong đợi kế hoạch được tạo bằng 'LIMIT' cần thiết phải giống với kế hoạch mà không có' LIMIT'. Nó * có thể * giống nhau, nhưng nó có thể hoàn toàn khác nhau, vì người lập kế hoạch sẽ tìm kiếm kế hoạch rẻ nhất để trả lại số hàng được yêu cầu, thay vì kế hoạch rẻ nhất để trả lại tất cả các hàng. Những thứ này thường khác nhau. – kgrittn

+0

Bất kỳ cơ hội nào cung cấp một ví dụ về truy vấn phụ ST_Collect() như với câu lệnh SQL ở trên? – aeupinhere

+0

@kgrittn Tất nhiên, nhưng tôi rất nghi ngờ nó sẽ rẻ hơn nếu không sử dụng một chỉ mục ở đó, vì vậy nó sẽ được sử dụng như một chẩn đoán cho những gì tôi đã nói. – lynxlynxlynx

Các vấn đề liên quan