T-SQL在第一条记录匹配内联查询计算条件后停止

T-SQL在第一条记录匹配内联查询计算条件后停止,sql,sql-server,Sql,Sql Server,我需要检查商户是否接近我的长期lat值。我不需要所有的人都在附近,我只需要知道是否至少有1个在附近 使用以下查询: SELECT * FROM ( SELECT TOP 1 Id, ImagePath, Title, Latitude, Longitude, 'Distance' = dbo.GetHaversineDistance(77.050888, 28.581181, Longit

我需要检查商户是否接近我的长期lat值。我不需要所有的人都在附近,我只需要知道是否至少有1个在附近

使用以下查询:

SELECT *
FROM
(
    SELECT  TOP 1
        Id, 
        ImagePath,
        Title,
        Latitude,
        Longitude,
        'Distance' = dbo.GetHaversineDistance(77.050888, 28.581181, Longitude, Latitude),
        [Address],
        City,
        PinCode,
        [State],
        Phone,
        DateCreated,
        DateLastUpdated,
        IsDeleted,
        MerchantCode
    FROM MerchantLocations 
    ORDER BY Distance

) AS Locations
WHERE Distance <= 50
尽管有排名前1的记录,但我知道表中的所有记录都会进行哈弗森计算,然后按距离排序,然后我选择排名前1的记录


如果至少有一条记录小于50,是否可以停止表格扫描和哈弗森计算?有没有办法不对所有记录进行哈弗森计算?

我希望这个公式返回第一行,距离小于50:

SELECT TOP 1 ml.*, v.distance
FROM MerchantLocations ml CROSS APPLY
     (VALUES (dbo.GetHaversineDistance(77.050888, 28.581181, Longitude, Latitude))
     ) v(distance)
WHERE distance <= 50;
使用orderby需要计算所有行,因此需要计算所有行的距离


如果你正在存储和处理地理数据,你可以考虑一个空间索引。这可能会加快许多查询的速度;开始的位置是。

当然,需要为每一行计算距离,这是您订购的列。在计算距离值之前,无法将行按距离顺序排列。我认为这里没有太大的改进空间,因为您需要知道每个数据点的距离,以便返回距离为50的所有点中最近的点。但是,我怀疑,您可以通过将多行标量函数转换为内联表值函数来提高查询的性能,或者,如果您在2019年,则可能会使用内联标量函数,但由于它已过期2天,我怀疑您是否在使用它。想象一下,如果您被问到的是银行余额总额最高的人。您将获得一份人员列表,以及他们各自余额的价值,但不是总价值。有些人只有1个帐户,但其他人只有10个。您是否可以轻松地选择正确的人员,而无需对其各自余额的值进行求和?不,你不能。SQLServer必须在这里做完全相同的事情;它必须首先计算出距离的值,然后才能将所有行按正确的顺序排列并返回前1行。必须首先计算距离。如果您只想知道是否有一行,那么为什么不使用EXISTS并删除顶部1和ORDER BY?SQL Server可以使现有查询短路。但是,当您告诉它按每行的值排序时,它不能不计算每行表达式的值。不知道,从来没有听说过谢谢@Gordon。这确实是一个最佳的解决方案,如果它像我假设的那样:。此外,感谢您对空间索引的建议,我们将在未来的增强中牢记这一点