距离对PostGIS范围查询的影响

时间:2014-05-13 14:14:45

标签: postgresql postgis

我正在使用PostGIS的Radius查询功能,使用地理栏找到半径内的点:

select count(*) from goeocde_table WHERE  ST_DWithin(geog, ST_MakePoint(-76.07,36.21),640000) ;

我在geog列的顶部定义了一个空间索引。 但是,一旦增加半径,我就会看到很大的性能影响。是预期的吗?

1 个答案:

答案 0 :(得分:1)

简而言之,是的。 Postgres / Postgis中的空间索引基于R树,R树是一种树状结构,尝试根据边界框细分您的区域,请参阅http://en.wikipedia.org/wiki/R-tree,同时尝试在搜索速度和插入速度之间保持平衡/删除新值。 因此,如果您足够幸运地发出一个查询,其中您的点加上它周围的距离完全包含在叶节点上的一个框中,那么您将获得非常快速的响应。一旦放大搜索区域,使其与相邻的边界框相交,就会有更多的候选者搜索距离你指向任何潜在候选人的距离。

另请注意,查询中的点位于纬度/经度,但搜索距离以米为单位,因此根据上面的示例查询,您要求的是一个非常大的搜索区域。 Postgis中有另一个空间运算符< - >,如果您正在寻找某个点的x个最近邻居,可以导致搜索速度更快,请参阅http://postgis.net/docs/geometry_distance_centroid.html