Tôi đang cố gắng tính toán một số thống kê cho dữ liệu OSM bằng PostgreSQL 9.3.5 và PostGIS 2.1.4. Tôi bắt đầu với một trích xuất bavaria nhỏ mà tôi đã tải xuống từ Geofabrik. Lược đồ db là lược đồ API 0.6 thông thường, dữ liệu được nhập thông qua cách tiếp cận kết xuất vào Postgres (sử dụng các tập lệnh pssnapshot_schema_0.6 * .sql đi kèm với thẩm thấu). ANALYZE VACUUM cũng đã được thực hiện.
Điều duy nhất được thực hiện mà tôi đang sử dụng là một bảng đa giác chứa nhiều đa giác cho tất cả các quan hệ ranh giới hành chính. Hình học đa giác không được đơn giản hóa theo bất kỳ cách nào.
Những gì tôi đang cố gắng đạt được là đếm tất cả các nút bên trong quản trị = 6 ranh giới của bavaria. Đây là truy vấn SQL của tôi:
SELECT relpoly.id, count(node)
FROM bavaria.relpolygons relpoly, bavaria.nodes node
WHERE relpoly.tags @> '"boundary"=>"administrative","admin_level"=>"6"'::hstore
AND ST_Intersects(relpoly.geom, node.geom)
GROUP BY relpoly.id;
Thời gian chạy của truy vấn này rất tệ vì Postgres đang thực hiện nối vòng lặp lồng nhau và quét qua tất cả các nút cho mỗi ranh giới admin = 6. FYI, bavaria được chia thành 98 admin = 6 đa giác và có khoảng 30 triệu nút trong trích xuất bavaria.
Có thể tránh việc thực hiện truy vấn tối ưu phụ này và nói với Postgres rằng nó chỉ nên quét tất cả các nút một lần (ví dụ: bằng cách tăng bộ đếm cho đa giác tương ứng trong tập kết quả hoặc bằng cách sử dụng gợi ý)?
Biên tập:
1) chỉ số không gian tồn tại trên các nút bavaria:
CREATE INDEX idx_nodes_geom ON bavaria.nodes USING gist (geom);
2) kế hoạch truy vấn trông như thế này:
HashAggregate (cost=284908.49..284908.75 rows=26 width=103)
-> Nested Loop (cost=111.27..283900.80 rows=201537 width=103)
-> Bitmap Heap Scan on relpolygons relpoly (cost=4.48..102.29 rows=26 width=5886)
Recheck Cond: (tags @> '"boundary"=>"administrative", "admin_level"=>"6"'::hstore)
-> Bitmap Index Scan on relpolygons_geom_tags (cost=0.00..4.47 rows=26 width=0)
Index Cond: (tags @> '"boundary"=>"administrative", "admin_level"=>"6"'::hstore)
-> Bitmap Heap Scan on nodes node (cost=106.79..10905.50 rows=983 width=127)
Recheck Cond: (relpoly.geom && geom)
Filter: _st_intersects(relpoly.geom, geom)
-> Bitmap Index Scan on idx_nodes_geom (cost=0.00..106.55 rows=2950 width=0)
Index Cond: (relpoly.geom && geom)
3)
Tôi đã tạo hai chỉ mục sau, nhưng kế hoạch truy vấn (và thời gian chạy) không thay đổi
CREATE INDEX relpolygons_tags_boundary on bavaria.relpolygons( (tags->'boundary') );
CREATE INDEX relpolygons_tags_admin on bavaria.relpolygons( (tags->'admin_level') );
ANALYZE bavaria.relpolygons;
boundary
và admin_level
) thành các cột bổ sung trên bảng và sử dụng trực tiếp các thẻ đó.