假设我有三张桌子:
来自(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)
由于
答案 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);