SQL География Быстрый Ближайший сосед с порядком по расстоянию - PullRequest
2 голосов
/ 27 января 2012

Мне нужно вытащить список адресов на основе текущего местоположения и в пределах определенного радиуса. Наш поиск по умолчанию допускает радиус в 25 миль, а с другими параметрами возвращает около 5400 результатов. Мы сохранили адреса как географические точки и создали довольно приличный поиск, но выполнение запроса занимает около 3 секунд. Просматривая план выполнения, я вижу, что сортировка занимает больше всего времени, что имеет смысл. Что я могу сделать, чтобы ускорить это? Нам все равно, что он супер точный, так что достаточно близко и оценки в порядке. Используемый нами запрос ниже минус большая часть другой логики фильтрации и подкачки.

declare @currentLatitude float, @CurrentLongitude float
declare @currentPosition geography
declare @radiusBuffer geography
Set @radiusBuffer = @currentPosition.BufferWithTolerance(10 * 1609.344,.9,1);
set @CurrentLatitude = 39.340579
set @CurrentLongitude = -86.697479
SET @currentPosition = geography::Point(@CurrentLatitude, @CurrentLongitude, 4326);

SELECT a.*,
ROW_NUMBER() OVER (ORDER BY rt.Position.STDistance(@currentPosition) ASC) AS RowNum
 from    [Address] a 
   where a.Position.Filter(@radiusBuffer) = 1

1 Ответ

1 голос
/ 29 апреля 2012

Попробуйте использовать «WHERE a.Position.STDistance (@currentPosition) <16093.44», принудительно использовать пространственный индекс с подсказкой запроса и использовать «ORDER BY a.Position.STDistance (@currentPosition)» вместо ROW_NUMBER (). </p>

...