我需要返回数据库中与给定点非常接近的所有条目。目前我正在这样做(在WHERE部分):
OR (
(Addresses.Latitude IS NOT NULL)
AND (Addresses.Longitude IS NOT NULL)
AND ( Abs(Addresses.Latitude - @SearchInLat) < 0.5)
AND ( Abs(Addresses.Longitude - @SearchInLng) < 0.5)
)
我正在做曼哈顿距离而不是笛卡尔距离,因为我的数据库有大量记录,计算平方根很慢。
我对SQL数据库很陌生,但我记得在SELECT procudures中有一些函数被认为是非常糟糕的效率。这甚至适用于非常简单的功能,例如取绝对值吗?是这样的:
OR (
(Addresses.Latitude IS NOT NULL)
AND (Addresses.Longitude IS NOT NULL)
AND ( (Addresses.Latitude - @SearchInLat) < 0.5)
AND ( (Addresses.Latitude - @SearchInLat) > -0.5)
AND ( (Addresses.Longitude - @SearchInLng) < 0.5)
AND ( (Addresses.Longitude - @SearchInLng) > -0.5)
)
更好的解决方案?
答案 0 :(得分:5)
在返回的数据上运行函数通常效率不高 - 就像你的ABS一样。但是,我不认为你在这种情况下有任何麻烦。您可以通过尝试以下内容来避免使用该功能:
OR (
(Addresses.Latitude IS NOT NULL)
AND (Addresses.Longitude IS NOT NULL)
AND ( (Addresses.Latitude - @SearchInLat) BETWEEN -0.5 AND 0.5)
AND ( (Addresses.Longitude - @SearchInLng) BETWEEN -0.5 AND 0.5)
答案 1 :(得分:2)
我认为ABS和一些内置函数(比如数学函数)很容易被优化器处理 - 其他函数不是那么多(字符串和日期操作)。
在您的特定情况下,我认为您可以使用ABS。