Самый эффективный способ получить точки в радиусе точки с пространством сервера SQL - PullRequest
6 голосов
/ 16 июня 2011

Я пытаюсь разработать наиболее эффективный запрос для получения точек в радиусе заданной точки. Результаты не должны быть очень точными, поэтому я бы предпочел скорость, а не точность.

Мы попытались использовать предложение where, сравнивающее расстояние точек с использованием STDistance, например, где @point и v.GeoPoint - это типы географии:

WHERE v.GeoPoint.STDistance(@point) <= @radius

Также один, использующий STIntersects, похож на этот:

WHERE @point.STBuffer(@radius).STIntersects(v.GeoPoint) = 1

Является ли какой-либо из этих запросов предпочтительным или есть другая функция, которую я пропустил?

1 Ответ

3 голосов
/ 20 июня 2011

Если точность не имеет первостепенного значения, то использование функции Filter может быть хорошей идеей: http://msdn.microsoft.com/en-us/library/cc627367.aspx

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

Кроме того, если вам не нужно много совпадений, то сначала нужно выполнить фильтр, а затем выполнить полное пересечение.

...