3 database algorithm postgresql performance postgis
我有以下查询来检查点(T.latitude, T.longitude)是否在 a 内POLYGON
query = """
SELECT id
FROM T
WHERE ST_Intersects(ST_Point(T.latitude, T.longitude), 'POLYGON(({points}))')
"""
Run Code Online (Sandbox Code Playgroud)
但它工作缓慢,如果我有以下索引,我该如何加快速度:
(latitude, longitude)?
查询很慢,因为它必须为每对可能的点计算公式。所以它让 postgress 服务器做很多数学运算,并强制它扫描你的整个位置表。我们如何优化它?也许我们可以消除太北或太南或太远东或西的点?
1) 添加一个 Geometry(Point) 类型的几何列并填充它:
ALTER TABLE T add COLUMN geom geometry(Point);
UPDATE T SET geom = ST_Point(T.latitude, T.longitude);
Run Code Online (Sandbox Code Playgroud)
2)创建空间索引:
CREATE INDEX t_gix ON t USING GIST (geom);
Run Code Online (Sandbox Code Playgroud)
3) 使用ST_DWithin而不是 ST_Intersect:
WHERE ST_DWithin('POLYGON(({points}))', geom, 0)
Run Code Online (Sandbox Code Playgroud)
您实际上想找到多边形内的点,因此 ST_DWithin() 就是您所需要的。从文档:
此函数调用将自动包含一个边界框比较,它将利用任何可用的索引
PS:
如果您由于某种原因无法做到第 1 点和第 2 点,那么至少使用 ST_Dwithin 而不是 ST_Intersect:
WHERE ST_DWithin('POLYGON(({points}))', ST_Point(T.latitude, T.longitude), 0)
Run Code Online (Sandbox Code Playgroud)
最后一个参数是容差。