PostgreSQL 9.3.5 및 PostGIS 2.1.4를 사용하여 OSM 데이터에 대한 일부 통계를 계산하려고합니다. Geofabrik에서 다운로드 한 작은 바바리아 추출물로 시작했습니다. db 스키마는 일반적인 API 0.6 스키마이며 덤프 접근 방식을 통해 Postgres로 데이터를 가져 왔습니다 (osmosis와 함께 제공되는 pgsnapshot_schema_0.6 * .sql 스크립트 사용). 진공 분석도 수행되었습니다.
내가 사용하는 유일한 사용자 정의 작업은 모든 관리 경계 관계에 대한 다중 다각형을 포함하는 다각형 테이블입니다. 다각형 지오메트리는 어떤 식으로도 단순화되지 않았습니다.
내가 지금 달성하려는 것은 바이에른의 admin = 6 경계 안에있는 모든 노드를 계산하는 것입니다. 내 SQL 쿼리는 다음과 같습니다.
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;
Postgres가 중첩 루프 조인을 수행하고 모든 admin = 6 경계에 대해 모든 노드를 스캔하기 때문에이 쿼리의 런타임은 끔찍합니다. 참고로, 바바리아는 98 admin = 6 폴리곤으로 나뉘며 바바리아 추출물에는 약 3 천만 개의 노드가 있습니다.
이 차선의 쿼리 실행을 피하고 Postgres에게 모든 노드를 한 번만 스캔해야한다고 말할 수 있습니까 (예 : 결과 세트에서 해당 다각형에 대한 카운터를 증가 시키거나 힌트를 사용하여)?
편집하다:
1) 바바리아 노드에 공간 인덱스가 존재합니다.
CREATE INDEX idx_nodes_geom ON bavaria.nodes USING gist (geom);
2) 쿼리 계획은 다음과 같습니다.
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)
삼)
다음 두 인덱스를 만들었지 만 쿼리 계획 및 런타임이 변경되지 않았습니다.
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
및 admin_level
)를 테이블의 추가 열로 추출하여 직접 사용하십시오.