2012-07-01 5 views
5

두 개의 테이블을 교차시키고 싶습니다. 첫 번째 표는 약 5 천만 점을 나타내고 두 번째 표는 전 세계 모든 국가의 다각형 층입니다. 그 다각형과 교차하는 모든 점을 얻고 싶습니다.Postgresql Spatial Query가 너무 느립니다.

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); 

이 쿼리는 매우 간단하지만 실행하는 데 4 시간 이상이 걸립니다. 각 테이블의 기하 구조 열에 GIST 인덱스를 작성하고 VACUUM ANALYZE 할 것입니다. 여전히 성능은 향상되지 않습니다. 나는 CENTOS 6를 Postgres 8.4와 PostGIS 1.5와 함께 사용하고 있습니다. 누구든지 일을 빠르게하는 방법에 대해 밝히는 사람이 있습니까? 1000에서 10000 개의 레코드로 질의를 제한 할 때 결과가 매우 빨리 나타납니다. 전체 결과 집합을 가져 오려고하면 끌기가됩니다. 생각?

업데이트 : 이제이 프로세스의 첫 번째 단계로 내 쿼리를 수정해야합니다. 이런 봉투를 얻을 수 있습니다.

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

이제 전체 쿼리의 일부로 이것을 포함하거나 실행하는 가장 효율적인 방법은 무엇입니까?

+1

을 최근 릴리스에서는 GiST 및 GIN 인덱스가 향상되었습니다. 새 주요 릴리스로 업그레이드하는 것이 좋습니다. SP-GiST가 포함되어 있기 때문에 9.2 베타 릴리스에서 문제를 시험해 볼 가치가 있습니다. http://www.postgresql.org/docs/9.2/static/spgist-intro.html – kgrittn

답변

1

EXPLAIN (및 LIMIT)으로 실행하여 인덱스가 전혀 사용되지 않는지 확인하십시오.

실제 교차 검사는 가장 느린 작업이므로 부속 조회 ST_Collect (ST_Intersects 점검을 제외한 모든 것)에 대해 실행하면 어쩌면 도움이됩니다. 그렇게하면 전화가 한 번만 있고 멀티 지형도 작성이 충분히 빠르면 그물 결과가 더 좋을 수 있습니다.

EDIT1 : 글쎄, 당신은 (또한 ID를 유지하기 위해) 3D 할 좌표를 강제하지 않는 한 별도의 조회가 기하 ID를 얻기 위해 필요하기 때문에 그것 때문에 최적이 아닌 밝혀 :

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

'LIMIT'을 사용하여 생성 된 계획이 반드시 'LIMIT'이없는 계획과 유사 할 것으로 기대하지 마십시오. 플래너는 요청 된 행 수를 반환하는 가장 저렴한 플랜을 찾고 모든 행을 반환하는 가장 저렴한 플랜을 찾고 있으므로 완전히 다를 수 있습니다. 그것들은 종종 다릅니다. – kgrittn

+0

위의 SQL 문과 같이 ST_Collect() 부속 조회의 예제를 제공 할 가능성이 있습니까? – aeupinhere

+0

@ kgrittn 물론 색인을 사용하지 않는 것이 더 저렴할 것이라는 점은 의심 스럽다. 그래서 내가 말한 것을 진단하는 데는 좋을 것이다. – lynxlynxlynx

관련 문제