2014-02-07 68 views
1

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

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

LOCATION1是基于用户的位置

Location1.STDistance(LOCATION2),LOCATION2是该项目的位置。

一旦我们进入成千上万行,这表现不佳,但我不知道有什么聪明的方法来做到这一点。我认为将所有可能的查询距离计算与查询时计算相比较并不可行。 (这意味着存储唯一用户位置X的唯一物品位置的数量。)

位置由邮政编码确定。地理范围仅限于美国。

还有其他想法吗?

回答

2

人们通常处理缓慢的地理查询的方式是将集合减小到足够小以至于可以在合理的时间内执行。就你而言,人们通常使用一种称为“地理装箱”的技术。

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

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

这种方法唯一的缺点是它有可能忽略最近的点。想想一个接触盒子边缘的圆圈与圆圈内的盒子。包装盒角落中的点可能会包含在内,但包装盒外的更近点(x轴或y轴)可能会被排除。纬度/经度箱实际上更像梯形而不是正方形,因为离赤道越远。

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

+0

嗯,我喜欢这个,但是我已经有了一箱,因为我有拉特,所有的邮政编码,甚至认为这不是高度精确,它已经缩小了计算。 – Nate