T-SQL在第一条记录匹配内联查询计算条件后停止
我需要检查商户是否接近我的长期lat值。我不需要所有的人都在附近,我只需要知道是否至少有1个在附近 使用以下查询: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
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。这确实是一个最佳的解决方案,如果它像我假设的那样:。此外,感谢您对空间索引的建议,我们将在未来的增强中牢记这一点