2013-04-11 2 views
1

두 세트의 데이터가 값 비싼 공간 조건 자와 조인되는 유스 케이스가 있습니다. 쿼리를 병렬화하기 위해 필자는 공간 유니버스를 동일한 수의 타일에 속하는 레코드 만 공간적 조건 자로 테스트해야하는 것과 같이 (수천 순서로) 타일로 분할했습니다. 쿼리는 다음 : 대용량 데이터 세트의 공간 조인 쿼리 최적화

SELECT ST_Area(ST_Intersection(A.polygon, B.polygon)) 
    /ST_Area(ST_Union(A.polygon, B.polygon)) AS a_ratio 
FROM spatial_table_a A 
JOIN spatial_table_b B ON ST_Intersects(A.polygon, B.polygon) 
WHERE A.tilename = B.tilename; 

이상적 쿼리 계획은 인덱스 스캔을 사용 ST_Intersects 의하면 공간 술어를 수행 tilename에 따른 기록 해시 가입하거나 중첩 루프가 합류한다.

그러나 이제는 공간 조인을 조기에 수행하는 차선의 계획을 세우고 있습니다. 이 계획은 아래와 같습니다

-> Hash Join (cost=759468.44..377874772.26 rows=2610 width=18) 
     Hash Cond: "outer"."?column4?" = "inner"."?column4?" 
      Join Filter: a.polygon && b.polygon AND _st_intersects(a.polygon, b.polygon) 
      -> Seq Scan on spatial_table_b b (cost=0.00..409556.95 rows=288816 width=1034) 
      -> Hash (cost=375827.86..375827.86 rows=283522 width=946) 
        -> Seq Scan on spatial_table_a a (cost=0.00..375827.86 rows=283522 width=946) 

그래서, 내 질문은 : 어떻게 (기본적으로 순서에 가입 변경) 더 좋은 계획을 생성하는 쿼리 최적화 프로그램을 강제 할 수 있습니까?

+0

죄송합니다. 공백을 편집했습니다. 나는 수평 스크롤을 좋아하지 않는다. – wildplasser

+0

분명히 join 논리의 일부인 경우, join 절에'A.tilename = B.tilename'을 포함시키지 않으시겠습니까? –

+0

@JakubKania 그렇다면 spatial_table_b B_ST_Intersects (A.polygon, B.polygon)와 A.tilename = B.tilename에 가입 ​​하시겠습니까? 쿼리 계획은 변경되지 않습니다. – ablimit

답변

1

방법에 대해 :

SELECT ST_Area(ST_Intersection(a, b)) 
    /ST_Area(ST_Union(a, b)) AS a_ratio 
FROM 
(
SELECT a.polygon AS a, b.polygon AS b 
FROM spatial_table_a A 
JOIN spatial_table_b B 
    ON A.tilename = B.tilename 
OFFSET 0 
) AS q 
WHERE ST_Intersects(a, b); 

이 처음 tilename에있는 두 개의 테이블을 조인하는 쿼리 계획을 강제로 두 개의 폴리곤이 교차하는 경우에만 다음 확인해야합니다. 그것은 당신에게 다른 질의 계획을 줄 것입니다.하지만 당신이 찾고있는 질의 계획이 될지 확실하지 않습니다.

+0

많은 감사합니다 @JakubKania. 이것은 내가하고 싶은 것에 더 가깝습니다. 문제는 데이터베이스가 내부 하위 쿼리 이후에 모든 레코드를 하나의 노드로 수집한다는 것입니다. 수집 작업을 수행하기 전에 교차 필터링을 적용 할 수 있다면 완벽 할 것입니다. – ablimit

+0

@ablimit 그럴 가능성이 있습니다. 내가 생각할 수있는 또 다른 유일한 방법은 검색을 위해 GiST 인덱스를 사용할 상관 관계가있는 하위 쿼리를 만드는 것입니다.하지만 각 행에 대해 호출되므로 미리 정의 된 하나의 다각형과 교차하는 다각형을 검색하는 데 걸리는 시간을 측정해야합니다. 현재 시간. 또한 int (http://www.postgresql.org/docs/9.2/static/btree-gist.html)에 대한 GIST가 있으므로 (틸트 네임, 폴리곤)에 대한 색인을 볼 가치가 있습니다. –

관련 문제