2012-07-03 3 views
0

Я пытаюсь найти местоположения на некотором расстоянии от заданных координат. На столе с запросом около 32 тыс. Записей требуется около 2 секунд - это слишком медленно, imo.Пространственный запрос - низкая производительность, не используя индекс

Он выполняет кластерное сканирование индексов, что является логическим - оно должно вычислять расстояние для каждого местоположения. Однако я все же считаю, что это должно быть быстрее, чем набор данных, этот маленький. У меня есть определенный пространственный индекс, но он не используется, и запрос терпит неудачу, если я его заставляю.

Большую часть времени (~ 86%) расходуется на фильтр, который вычисляет расстояние - так что я ищу способы оптимизации, что и мне нужна помощь здесь ..

Запрос я м используется следующее:

SELECT Name 
FROM Venue 
WHERE (Coordinates.STDistance(geography::STPointFromText('POINT(-113.512245 51.498212)', 4326))/1000) <= 100 
+0

Возможный дубликат [Являются ли функции пространственной информации SQL Server 2008 полезными для сопоставления запросов?] (Http://stackoverflow.com/questions/1343293/are-sql-server-2008-spatial-data-features-useful-for -mapping-query) – TomTom

+1

Почему вы делите на 1000 в предложении StDistance? Можно ли это рассчитать в другом месте? – CatchingMonkey

+2

Изменение на WHERE Координаты.STDistance (география :: STPointFromText ('POINT (-113.512245 51.498212)', 4326)) <= 100000 позволит использовать пространственный индекс как первичный фильтр, а не сканирование таблицы. Тем не менее вам может потребоваться явный указатель индекса, если вы используете SQL 2008. –

ответ

0

Один из старых подходов - использовать коробку.

С вашей точки зрения, сделайте две точки на противоположных концах коробки. + R/+ R и -R/-R из центра.

Затем вы можете фильтровать - точка должна быть в этом поле И в круге, который вы описываете.

Проверка коробки может выполняться по индексу и убивает большинство элементов.

Простая школьная геометрия. Вы рисуете прямоугольный прямоугольник вокруг круга, который вы описываете.

Ваш текущий подход не может использовать индекс, потому что индекс не содержит полей.

ALTERNATIVELY: DRAW A CIRCLE - не используйте расчет расстояний. Нарисовать круг. С точками.

Или прочитайте https://stackoverflow.com/questions/11311363/my-application-is-about-asp-net-using-linq-and-remote-mssql-my-connection-is-be, который является тем же вопросом, который вы задаете.

+0

Я как-то сделал .. Используя STBuffer. – Evgeni

Смежные вопросы