2012-06-04 44 views
0

假設我有三個表:PostGIS的空間查詢援助

  • A.自治市(的MultiPolygon)
  • B.郵編質心(點)
  • C.用戶數據(點)

來自(C)的條目將(B)中的條目與FK(代碼)匹配。

我在尋找一種有效的方式來:用戶數據(C)的在使用城市ST_Contains

計數數(A)。

BUT

這裏是漁獲:

如果C中的條目是NULL(或匹配的其它條件)使用,如果存在使用FK B中的匹配條目!! !

目前我已經嘗試了各種圖案,雖然空間查詢& B和A &下,兩個都是亞秒,有一次我在一個查詢(目標)的結果是超過4secs添加它們放在一起

什麼,我已經試過樣品:

這是糟糕的(60+秒):

SELECT 
    A.*, 
    (SELECT FROM 
     (SELECT CASE WHEN C.GEOM IS NULL THEN B.GEOM ELSE C.GEOM END 
     FROM C LEFT JOIN B ON C.ID=B.ID) AS b 
     WHERE ST_CONTAINS(A.GEOM, b.GEOM) 
    ) count 
FROM 
    A 

這是15秒:

SELECT 
    A.ID, ..., -- other A fields 
    COUNT(B.GEOM) 
FROM 
    A, 
    (SELECT CASE WHEN C.GEOM IS NULL THEN B.GEOM ELSE C.GEOM END 
    FROM C LEFT JOIN B ON C.ID=B.ID) AS b 
WHERE 
    ST_Contains(A.GEOM, b.GEOM) 
GROUP BY 
    A.ID, ... -- other A fields 

正如我所說

SELECT COUNT(*) FROM A LEFT JOIN B ON ST_Contains(A.GEOM, B.GEOM) 

SELECT COUNT(*) FROM A LEFT JOIN C ON ST_Contains(A.GEOM, C.GEOM) 

兩個第二下返回英寸

各項指標到位外鍵以及(B.ID = C.ID)

感謝

+0

我應該指出的是,第一個查詢(60+秒)優於第二如果不需要CASE語句(即使用僅有B點) – George

回答

0

你有沒有make indexes爲A.geom和B.geom?

這將是

CREATE INDEX idx_A ON A USING GIST (GEOM); 
VACUUM ANALYZE A (GEOM); 
CREATE INDEX idx_B ON B USING GIST (GEOM); 
VACUUM ANALYZE B (GEOM); 
+0

是的,在空間索引地方(忘記提及) – George