[英]Spatial Join Query Optimization on Large Data Set
我有一個用例,其中兩組數據與一個昂貴的空間謂詞結合在一起。 為了並行化查詢,我將空間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
對記錄進行哈希tilename
,然后使用索引掃描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)
因此,我的問題是:如何強制查詢優化器生成更好的計划(這基本上會改變連接順序)?
怎么樣:
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上,然后才檢查兩個多邊形是否相交。 這將為您提供不同的查詢計划,但是我不確定這是否是您要查找的查詢計划。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.