2013-08-20 2 views
4

Я использую Microsoft SQL Server 2012, и у меня есть простой запрос, который выбирает 50 лучших пользователей заказанные ближайший к конкретной точке, например:Ближайший сосед поиск производительность запроса

DECLARE @Location geography = geography::Point(30.9384016, 29.9582148, 4326) 

SELECT TOP 50 * 
FROM Users 
ORDER BY LastLocation.STDistance(@Location) 

Глядя на исполнение план, я могу видеть, что он не использовал свой пространственный индекс

enter image description here

таблица содержит около 40 000 записей и запрос занимает более 1 минуты в исполнении, мой пространственный индекс создается следующим образом:

create spatial index IX_Location ON Users (LastLocation) using GEOGRAPHY_AUTO_GRID 

Я попытался с помощью намекая на мой запрос и указать индекс вроде следующего:

DECLARE @Location geography = geography::Point(30.9384016, 29.9582148, 4326) 

SELECT TOP 50 * 
FROM Users WITH (INDEX(IX_Location)) 
WHERE LastLocation.STDistance(@Location) IS NOT NULL 
ORDER BY LastLocation.STDistance(@Location) 

Но на самом деле это займет гораздо больше времени исполнения, может кто-нибудь сказать мне, как я могу улучшить производительность этого запроса?

Благодаря

ответ

1

Добавить пункт WHERE ограничить расстояние.

+0

Каким будет пример предложения where? – roemhildtg

+1

Боюсь, я забыл, что я думал три года назад, но, вероятно, что-то вроде 'WHERE LastLocation.STDistance (@Location) <10000'. –