我有一個使用案例,其中兩組數據與昂貴的空間謂詞連接。爲了並行化查詢,我將空間Universe劃分爲瓦片(數千個數量級),以便只有屬於同一瓦片的記錄需要使用空間謂詞進行測試。查詢如下:大數據集上的空間連接查詢優化
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;
理想地,查詢計劃應根據tilename
散列記錄,那麼執行空間謂詞使用任一索引掃描檢查ST_Intersects
加入或嵌套循環連接。
但是,我現在得到的是一個過早執行空間連接的次優計劃。該計劃如下所示:
-> 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
如果它明顯是連接邏輯的一部分,爲什麼不在連接子句中包含'A.tilename = B.tilename'? –
@JakubKania所以你的意思是加入spatial_table_b B ON ST_Intersects(A.polygon,B.polygon)AND A.tilename = B.tilename?查詢計劃沒有變化。 – ablimit