Запрос пространственных данных для ближайшего соседа
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL в хранилище Microsoft Fabric в базе данных SQL Microsoft Fabric в Microsoft Fabric
Распространенный запрос, используемый с пространственными данными, является ближайшим соседним запросом. Ближайшие запросы соседей используются для поиска ближайших пространственных объектов к конкретному пространственному объекту. Например, указатель магазина для веб-сайта часто должен находить ближайшие расположения магазинов к расположению клиента.
Ближайший соседний запрос может быть записан в различных допустимых форматах запросов, но для ближайшего соседнего запроса, чтобы использовать пространственный индекс, необходимо использовать следующий синтаксис.
Синтаксис
SELECT TOP ( number )
[ WITH TIES ]
[ * | expression ]
[, ...]
FROM spatial_table_reference, ...
[ WITH
(
[ INDEX ( index_ref ) ]
[ , SPATIAL_WINDOW_MAX_CELLS = <value>]
[ ,... ]
)
]
WHERE
column_ref.STDistance ( @spatial_ object )
{
[ IS NOT NULL ] | [ < const ] | [ > const ]
| [ <= const ] | [ >= const ] | [ <> const ] ]
}
[ AND { other_predicate } ]
}
ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]
[ ; ]
Ближайшие соседние запросы и пространственные индексы
В SQL Server TOP
и ORDER BY
предложениях используются для выполнения ближайшего соседнего запроса к столбцам пространственных данных. Предложение ORDER BY
содержит вызов метода STDistance()
для типа данных пространственного столбца. Предложение TOP
задает количество возвращаемых запросом объектов.
Для ближайшего соседнего запроса необходимо выполнить следующие требования, чтобы использовать пространственный индекс:
В одном из пространственных столбцов должен иметься пространственный индекс, а метод
STDistance()
должен использовать этот столбец в предложенияхWHERE
иORDER BY
.Предложение
TOP
не может содержать инструкциюPERCENT
.Предложение
WHERE
должно содержать методSTDistance()
.Если в предложении
WHERE
имеется несколько предикатов, то предикат, содержащий методSTDistance()
, должен соединяться с другими предикатами условиемAND
. МетодSTDistance()
не может входить в необязательную часть предложенияWHERE
.Первое выражение в предложении
ORDER BY
должно вызывать методSTDistance()
.В первом выражении
STDistance()
в предложенииORDER BY
должен использоваться порядок сортировкиASC
.Все строки, для которых
STDistance
возвращаетNULL
, должны исключаться фильтром.
Предупреждение
Методы, которые принимают типы данных geography или geometry в качестве аргументов, возвращаются NULL
, если идентификаторы ШРИД не совпадают с типами.
Рекомендуется использовать новые пространственные индексы тесселяции для индексов, используемых в ближайших запросах соседей. Дополнительные сведения о пространственных индексах тесселяции см. в разделе "Пространственные данные".
Пример 1
В следующем примере кода показан ближайший соседний запрос, который может использовать пространственный индекс. В примере используется Person.Address
таблица в AdventureWorks2022
примере базы данных.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);
Создайте пространственный индекс в столбце SpatialLocation, чтобы узнать, как ближайший соседний запрос использует пространственный индекс. Дополнительные сведения о создании пространственных индексов см. в разделе Create, Modify, and Drop Spatial Indexes.
Пример 2
В следующем примере кода показан ближайший соседний запрос, который не может использовать пространственный индекс.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
ORDER BY SpatialLocation.STDistance(@g);
В запросе отсутствует предложение WHERE
, использующее STDistance()
указанным в разделе синтаксиса образом, поэтому данный запрос не может использовать пространственный индекс.