Самый эффективный способ получить точки в радиусе точки с пространством сервера 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
Во многих случаях это может быть на несколько порядков быстрее, потому что он не проверяет, было ли ваше совпадение точным. В индексе данные хранятся в виде сетки, поэтому, насколько жизнеспособным этот подход, вероятно, зависит от ваших параметров пространственного индекса.
Кроме того, если вам не нужно много совпадений, тогда сначала нужно выполнить фильтр, а затем выполнить полное пересечение.