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

时间:2017-07-13 09:25:18

标签: database algorithm postgresql performance postgis

我有以下查询检查点(T.latitude, T.longitude)是否在POLYGON

query = """
  SELECT id
  FROM T
  WHERE ST_Intersects(ST_Point(T.latitude, T.longitude), 'POLYGON(({points}))')
"""

但它运行缓慢,如果我有以下索引,我怎么能加快它: (latitude, longitude)

查询很慢,因为它必须为每对可能的点计算公式。所以它使得postgress服务器做了很多数学运算,它迫使它扫描你的整个位置表。我们怎样才能优化这个?也许我们可以消除太远的北方或太远的南方或太远的东方或西方的分数?

2 个答案:

答案 0 :(得分:3)

1)添加Geometry(Point)类型的几何列并填充它:

ALTER TABLE T add COLUMN geom geometry(Point);
UPDATE T SET geom = ST_Point(T.latitude, T.longitude);

2)创建spatial index

CREATE INDEX t_gix ON t USING GIST (geom);

3)使用ST_DWithin代替ST_Intersect:

WHERE ST_DWithin('POLYGON(({points}))', geom, 0)

您希望实际找到多边形内的点,因此ST_DWithin()就是您所需要的。来自documentation

  

此函数调用将自动包含一个边界框   比较将使用任何可用的索引

PS:

如果由于某种原因无法取得积分1和2,那么至少使用ST_Dwithin代替ST_Intersect:

WHERE ST_DWithin('POLYGON(({points}))', ST_Point(T.latitude, T.longitude), 0)

最后一个参数是公差。

答案 1 :(得分:0)

您可以轻松加快向脚本添加t1.geom&&t2.geom条件的空间查询

这种情况;

  • 所需的空间索引,因此您的空间列必须具有空间索引
  • 返回近似结果(但st_运算符给出精确结果)

以下是我的数据库和查询时间的示例;

select p.id,k.id, p.poly&&k.poly as intersects
    from parcel p , enterance k 
    where st_contains(p.poly,k.poly) and p.poly&&k.poly

    --without && 10.4 sec
    --with    && 1.6 sec

select count(*)  from parcel --34797
select count(*) from enterance --70715

https://postgis.net/docs/overlaps_geometry_box2df.html