【问题标题】:How to speed up query that use postgis extension?如何加快使用 postgis 扩展的查询?
【发布时间】:2017-12-17 23:52:21
【问题描述】:

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

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

但是它运行缓慢,如果我有以下索引,我该如何加快它: (latitude, longitude)?

查询很慢,因为它必须为每对可能的点计算公式。所以它让 postgress 服务器做很多数学运算,并强制它扫描你的整个位置表。我们该如何优化呢?也许我们可以消除太北或太南或太东或西太远的点?

【问题讨论】:

    标签: database algorithm postgresql performance postgis


    【解决方案1】:

    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)
    

    最后一个参数是公差。

    【讨论】:

    • 查询很慢,因为它必须为每对可能的点计算公式。所以它让 postgress 服务器做很多数学运算,并强制它扫描你的整个位置表。我们该如何优化呢?也许我们可以消除太北或太南的点?
    • 使用ST_DWithin而不是'ST_Intersects'的原因是什么?
    • it forces it to scan through your whole location table :我的回答的第 1 步和第 2 步应该正好解决了这一点。
    • 关于您的第二个问题:您想知道点是否在多边形内,因此 ST_DWithin 是您的最佳选择。来自文档:This function call will automatically include a bounding box comparison that will make use of any indexes that are available on the geometries. 另见postgis.net/2013/08/26/tip_ST_DWithin
    【解决方案2】:

    您可以通过将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

    【讨论】:

      猜你喜欢
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2015-01-15
      • 2021-07-01
      • 2018-06-21
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多