簡體   English   中英

大數據集的空間聯接查詢優化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM