두 세트의 데이터가 값 비싼 공간 조건 자와 조인되는 유스 케이스가 있습니다. 쿼리를 병렬화하기 위해 필자는 공간 유니버스를 동일한 수의 타일에 속하는 레코드 만 공간적 조건 자로 테스트해야하는 것과 같이 (수천 순서로) 타일로 분할했습니다. 쿼리는 다음 : 대용량 데이터 세트의 공간 조인 쿼리 최적화
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)
그래서, 내 질문은 : 어떻게 (기본적으로 순서에 가입 변경) 더 좋은 계획을 생성하는 쿼리 최적화 프로그램을 강제 할 수 있습니까?
죄송합니다. 공백을 편집했습니다. 나는 수평 스크롤을 좋아하지 않는다. – wildplasser
분명히 join 논리의 일부인 경우, join 절에'A.tilename = B.tilename'을 포함시키지 않으시겠습니까? –
@JakubKania 그렇다면 spatial_table_b B_ST_Intersects (A.polygon, B.polygon)와 A.tilename = B.tilename에 가입 하시겠습니까? 쿼리 계획은 변경되지 않습니다. – ablimit