【问题标题】:How to force Postgres using index?如何使用索引强制 Postgres?
【发布时间】:2017-07-18 09:05:43
【问题描述】:

我有以下查询可以找到所有id insidePOLYGON(({points}))

SELECT id
FROM t
WHERE ST_DWithin('POLYGON(({points}))', ST_Point(latitude, longitude), 0);

查询很慢,因为它不使用(latitude, longitude) 索引,并且必须为每对可能的点计算公式。

如何更改我的查询以强制 Postgres 使用(latitude, longitude) 索引(我需​​要更改查询,因为我无法添加一些其他索引)?

我有以下索引:

"index_latitude_longitude" btree (latitude, longitude)

纬度、经度有double precision类型

我认为如果我们添加类似 latitude <= ... and longitude <= ... 的内容,Postgres 将使用索引,我们该怎么做?

【问题讨论】:

  • 能否请您提供用于创建表和索引的 DDL?
  • @Arkhena 更新问题
  • 我无法添加任何其他索引或更改某些内容,因为我对数据库没有任何写入权限
  • 嗨@ipetr,我们假设(通过使用ST_DWithin)您使用PostgreSQL的PostGIS扩展(请添加“postgis”标签)......所以,你不需要做纬度/经度分析,PostGIS 将为您完成。我还建议查看ST_DWithin(g1,g2,dist) 使用,因为dist=0 说“没有距离”(!)。是ST_Intersection?使用相关的dist 参数测试您的查询。关于许可:对你的老板说你需要许可才能获得绩效(!!)。
  • 关于“我认为Postgres会使用索引(...)经纬度”,你错了:要么放弃PostGIS,要么使用PostGIS。

标签: database postgresql performance postgis


【解决方案1】:

PostGIS的空间索引是BBOX。

你在使用&&操作符时使用的是BBOX,先试试性能

   SELECT id FROM t
   WHERE 'POLYGON(({points}))' &&  ST_Point(latitude, longitude);

ST_DWithin 性能不错,但参数0 说“交集”,所以没有BBOX 优化。

其他问题是缓存,因为您正在构建几何:尝试

   CREATE TABLE kx_t AS 
     SELECT id, 
            'POLYGON(({points}))' as poly, 
            ST_Point(latitude, longitude) as pt  
     FROM t;

并使用kx_t 测试您的查询,所以

   SELECT id FROM kx_t
   WHERE poly &&  pt;

WHERE ST_Intersects(poly,pt)...

使用materialized viewkx_t,您可以使用CREATE INDEX xxx ON kx_t USING GIST (the_geom) 来提高性能。


PS:如果这里没有好的解决方案,请将您的问题复制到gis.stackexchange.com

【讨论】:

  • 谢谢,我认为如果我们添加类似 where ... and latitude <= ... and longitude <= ... 的内容,Postgres 会使用索引,我们该怎么做呢?
  • 嗨@ipetr,发布另一个问题。请检查我对您问题的回答:如果这是一个好的答案,请投票并接受。
【解决方案2】:

我强迫 Postgres 像这样使用索引:

SELECT id
FROM t, ( SELECT ST_GeomFromText('POLYGON(({points}))') as geom ) as polygon
WHERE longitude >= ST_XMIN(polygon.geom)
AND   longitude <= ST_XMAX(polygon.geom)
AND   latitude >= ST_YMIN(polygon.geom)
AND   latitude <= ST_YMAX(polygon.geom)
AND   ST_DWithin(polygon.geom, ST_Point(latitude, longitude), 0);

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 2019-10-07
    • 2013-06-13
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多