距离计算效率MSSQL Geography

时间:2014-02-07 17:01:43

标签: sql geography

我的SQL查询运行缓慢,我确定它与距离计算有关。 我使用这些计算进行排序,以便查找项目的用户可以在地理位置上显示最接近他们的结果。

我使用地理函数STDistance来计算与预先计算的sql地理数据类型位置的距离。

Location1.STDistance(LOCATION2)

Location1基于用户的位置,location2是项目的位置。

一旦我们进入数千行,这表现不佳,但我不知道有什么聪明的方法可以做到这一点。我认为在查询时存储查找与计算的所有可能距离计算是不可行的。 (这意味着存储唯一用户位置X个唯一项目位置的数量。)

地点由邮政编码决定。从地理位置来看,范围仅限于美国。

还有其他想法吗?

1 个答案:

答案 0 :(得分:2)

人们通常处理慢地理查询的方式是将集合减少到足够小以至于可以在合理的时间内执行。在你的情况下,人们通常采用一种称为“地理拳击”的技术。

概念是找到落在特定纬度/经度边界内的附近点。例如。如果我想找到42.45678,-22.6543附近的所有人,我首先要确定一个典型的最小距离。让我们假设它是25英里或+ - 0.15度纬度和经度。我会查询所有这些。 (Lat介于41.95和42.95之间,Lon介于-22.15和-23.15之间)。然后我会应用距离函数来找到缩小集合中最近的人。在我消除了显然不是非常接近的点之后,距离计算速度要快得多。

如果我的缩小设置似乎太大,那么我可以使用更小的盒子。如果我的结果集没有返回任何行或行数太少,那么我可以使用递归算法来选择一个越来越大的框,直到找到足够大的结果集。

这种方法的唯一缺点是它有可能省略最近点。想想一个接触盒子边缘的圆圈和一个圆圈内的盒子。可能会包含框角落中的点,但可能会排除框外(x轴或y轴)上更近的点。当你越远离赤道时,Lat / Lon盒实际上更像是梯形而不是正方形。

无论如何,如果速度比完美的准确性更重要。地理拳击是一种需要考虑的方法。