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扫描而没有索引)。
所以我想知道为什么它不使用索引,我应该如何改进?
答案 0 :(得分:2)
您不能指望ST_Distance_Sphere()
在此查询中使用索引。您正在对geom字段的内容进行计算,然后您正在对计算结果进行比较。数据库可能不会在这种情况下使用索引,除非您的函数索引与查询中的计算方法几乎完全相同。
找到距离某个点一定距离的位置的正确方法是使用ST_DWithin
ST_DWithin - 如果几何在指定范围内,则返回true 彼此的距离。对于几何单元,在空间中 参考和地理单位是米,测量是 默认为use_spheroid = true(测量球体周围),速度更快 check,use_spheroid = false来测量球体。
和
此函数调用将自动包含一个边界框 比较,将使用可用的任何索引 的几何形状。