2012-06-04 43 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