如何加快使用 postgis 扩展的查询?

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 服务器做很多数学运算,并强制它扫描你的整个位置表。我们如何优化它?也许我们可以消除太北或太南或太远东或西的点?

Tom*_*ico 5

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)

最后一个参数是容差。