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

时间:2016-08-16 06:53:13

标签: postgresql indexing postgis

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

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

然后,添加几何字段'geom':

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

并在其上创建gist索引:

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扫描而没有索引)。

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

1 个答案:

答案 0 :(得分:2)

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

找到距离某个点一定距离的位置的正确方法是使用ST_DWithin

  

ST_DWithin - 如果几何在指定范围内,则返回true   彼此的距离。对于几何单元,在空间中   参考和地理单位是米,测量是   默认为use_spheroid = true(测量球体周围),速度更快   check,use_spheroid = false来测量球体。

  

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