postgis空间查询辅助

时间:2012-06-04 22:04:09

标签: indexing postgis spatial

假设我有三张桌子:

  • 甲。市政当局(MultiPolygon)
  • B中。邮政编码质心(点)
  • ℃。用户数据(点)

来自(C)的条目将(B)上的条目与FK(代码)匹配。

我正在寻找一种有效的方法:

  

使用 ST_Contains 计算城市(A)中的用户数据(C)数量。

BUT

这是捕获:

  

如果C中的条目为NULL(或与其他条件匹配),请使用FK存在B中的匹配条目!

目前我尝试了各种模式,虽然空间查询A& B和A& C都是亚秒级的,一旦我在一个查询(目标)中将它们全部加在一起,结果就超过4秒

我尝试的样本:

这是更糟糕的(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)

由于

1 个答案:

答案 0 :(得分: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);