查询中的简单函数

时间:2011-08-19 16:18:57

标签: sql sql-server

我需要返回数据库中与给定点非常接近的所有条目。目前我正在这样做(在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)
)

更好的解决方案?

2 个答案:

答案 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。