0

假设我有三个表:

  • A. 市政当局(MultiPolygon)
  • B. 邮编质心(Point)
  • C. 用户数据(Point)

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

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

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

这是问题所在:

如果 C 中的条目为 NULL(或匹配另一个条件),则使用如果存在 B 中的匹配条目,则使用 FK !!!

目前我已经尝试了各种模式,虽然空间查询 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)

谢谢

4

1 回答 1

0

你为 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);
于 2012-06-04T22:28:47.620 回答