SQL 2003 Расстояние Широта Долгота - PullRequest
2 голосов
/ 22 марта 2010

У меня есть таблица, полная Дилеров, а также их широта и долгота. Я пытаюсь определить топ-n ближайших дилеров к любому лат и лону. У меня уже есть функция для вычисления расстояния между местоположениями, но я хочу сделать как можно меньше вычислений (моя таблица может содержать много тысяч записей). В настоящее время я должен рассчитать расстояние для каждой записи, а затем отсортировать их. Есть ли способ сортировки, прежде чем выполнять вычисления для повышения производительности?

Этот вопрос хорош, но Я не всегда буду знать свой диапазон. Должен ли я просто выбрать произвольно высокий диапазон, а затем уточнить свои результаты? Я благодарен за любую помощь, которую может предложить сообщество.

declare @Lat real
declare @lon real

Set @lat = 41.05
Set @lon = -73.53 

SELECT top 10
    MemberID,
    Address1,
    City,
    State,
    Zip,
    Phone,
    Lat,
    Lon,
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance
FROM
    Dealers
Order by
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon))

Ответы [ 2 ]

1 голос
/ 23 марта 2010

Я думаю, вам действительно нужен геопространственный индекс. В противном случае, поскольку число строк становится очень большим, вам придется обращаться к каждой отдельной строке, чтобы выполнить пифагорейское вычисление.

Похоже, что SQL Server поддерживает пространственные типы данных, а SQL Server 2008 даже может похвастаться " новыми пространственными индексами для высокопроизводительных запросов ". Не могли бы вы использовать пространственный тип данных SQL Server, а затем выполнить запрос близости к пространственному индексу?

1 голос
/ 22 марта 2010

Вместо того, чтобы выполнять вычисления для всех записей, вы можете использовать простое вычисление Пифагора для ваших чисел широты / долготы и выбрать верхние 20. Затем вы можете выбрать фактические первые 10, используя свою более точную функцию. Хотя начинать с этого неточно, оно должно быть достаточно точным, чтобы уменьшить ваш набор данных.

РЕДАКТИРОВАТЬ: Примерно так

declare @Lat real 
declare @lon real 

Set @lat = 41.05 
Set @lon = -73.53  

SELECT top 10 
    MemberID, 
    Address1, 
    City, 
    State, 
    Zip, 
    Phone, 
    Lat, 
    Lon, 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) as mDistance --Calculate distance 
FROM 
    Dealers 
WHERE
    MemberId IN
(
    SELECT TOP 20
        MemberID
    FROM
        Dealers
    ORDER BY
        SQRT(SQUARE(@Lat - Lat) + SQUARE(@Lon - Lon))
)
Order by 
    (SELECT fun_DistanceLatLon] (@Lat,@lon,Lat,Lon)) 

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

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