Самый эффективный способ получить точки в радиусе точки с пространством сервера SQL

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

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

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам