我有一个大型的客户数据库,实现在SQL Server 2005中。每个客户都有一个纬度和经度,表示为Decimal(18,15)
。数据库中最重要的搜索查询尝试查找所有接近某个位置的客户,如下所示:
(Addresses.Latitude - @SearchInLat) BETWEEN -1 * @LatitudeBound AND @LatitudeBound)
AND ( (Addresses.Longitude - @SearchInLng) BETWEEN -1 * @LongitudeBound AND @LongitudeBound)
所以,这是一个非常简单的方法。
@LatitudeBound
和@LongitudeBound
只是数字,用于在点@SearchInLat,@SearchInLng
的粗略边界矩形内检索所有客户。一旦结果到达客户端PC,一些结果被过滤掉,以便形成一个边界圆而不是矩形。(这是在客户端PC上完成的,以避免在服务器上计算平方根。)这种方法过去已经足够好用了。然而,我们现在想让搜索做更有趣的事情——例如,让返回的结果数量更加可预测,或者让用户动态增加搜索半径的大小。为此,我一直在考虑升级到sql server 2008,使用其地理数据类型、空间索引和距离函数。我的问题是:这些查询有多快?
目前我们所拥有的简单查询的优点是非常快速且不会对性能产生压力,这一点非常重要,因为它被频繁调用。基于类似以下内容的查询将有多快呢:
SearchInPoint.STDistance(Addresses.GeographicPoint) < @DistanceBound
相比之下,性能如何?空间索引是否有效,并且STDistance速度是否快?