为什么我的 postgis 不在几何字段上使用索引?

2024-05-16

Windows 上的 postgresql 9.5 + postgis 2.2。 我首先创建一个表:

CREATE TABLE points (
  id   SERIAL,
  ad   CHAR(40),
  name VARCHAR(200)
);

然后,添加一个几何字段“geom”:

select addgeometrycolumn('points', 'geom', 4326, 'POINT', 2);

并在其上创建要点索引:

CREATE INDEX points_index_geom ON points USING GIST (geom);

然后,我在表中插入大约 1,000,000 个点。

我想查询距给定点给定距离内的所有点。 这是我的sql代码:

SELECT st_astext(geom) as location FROM points
WHERE st_distance_sphere(
     st_geomfromtext('POINT(121.33 31.55)', 4326),
     geom) < 6000;

结果是我想要的,但是太慢了。 当我explain analyze verbose在这段代码中,我发现它没有使用points_index_geom(解释显示seq扫描并且没有索引)。

所以我想知道为什么它不使用索引,我应该如何改进?


你不能期望ST_Distance_Sphere()对此查询使用索引。你正在对geom字段的内容进行计算,然后对计算结果进行比较。在这种情况下,数据库可能不会使用索引,除非您有一个函数索引,其计算与查询中的计算几乎相同。

查找距某个点给定距离内的位置的正确方法是使用ST_DWithin http://postgis.net/docs/ST_DWithin.html

ST_DWithin — 如果几何图形在指定范围内,则返回 true 彼此的距离。因为几何单位是空间单位 参考和地理单位以米为单位,测量为 默认为 use_spheroid=true (围绕球体测量),以便更快 检查,use_spheroid=false 沿球体测量。

and

该函数调用将自动包含一个边界框 比较将利用任何可用的索引 几何形状。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 postgis 不在几何字段上使用索引? 的相关文章

随机推荐