Остановка T-SQL после первой записи соответствует условию вычисления встроенного запроса - PullRequest
2 голосов
/ 06 ноября 2019

Мне нужно проверить, подходит ли продавец к моим длинным латам или нет. Мне не нужны все те, кто рядом, мне просто нужно знать, находится ли по крайней мере 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

Несмотря на то, что у меня есть Top 1, я знаюРасчет haversine сделан для всех моих записей в таблице, затем они сортируются по расстоянию, а затем я выбираю Top 1.

Можно ли остановить сканирование таблицы и расчет haversine, если хотя бы 1 записьменее 50? Есть ли способ НЕ делать расчет haversine для всех записей?

1 Ответ

1 голос
/ 06 ноября 2019

Я ожидаю, что эта формулировка вернет «первую» встреченную строку с расстоянием менее 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;

Использование ORDER BY потребует, чтобы все строки были оценены, поэтому расстояниеНеобходимо рассчитать для всех строк.

Если вы храните и обрабатываете географические данные, вы можете рассмотреть пространственный индекс. Это может ускорить многие ваши запросы;место для начала находится в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...