Поделиться через


Запрос пространственных данных для ближайшего соседа

Область применения:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureКонечная точка аналитики SQL в Microsoft FabricХранилище в Microsoft FabricБаза данных SQL в 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 задает количество возвращаемых запросом объектов.

Для ближайшего соседнего запроса необходимо выполнить следующие требования, чтобы использовать пространственный индекс:

  1. В одном из пространственных столбцов должен иметься пространственный индекс, а метод STDistance() должен использовать этот столбец в предложениях WHERE и ORDER BY.

  2. Пункт TOP не может содержать оператор PERCENT.

  3. Предложение WHERE должно содержать метод STDistance().

  4. Если в предложении WHERE имеется несколько предикатов, то предикат, содержащий метод STDistance(), должен соединяться с другими предикатами условием AND. Метод STDistance() не может входить в необязательную часть предложения WHERE.

  5. Первое выражение в предложении ORDER BY должно вызывать метод STDistance().

  6. Порядок сортировки для первого выражения STDistance() в предложении ORDER BY должен быть ASC.

  7. Все строки, для которых STDistance возвращает NULL, должны исключаться фильтром.

Предупреждение

Методы, которые принимают типы данных geography или geometry в качестве аргументов, вернут NULL, если идентификаторы SRID не совпадают для типов.

Рекомендуется использовать новые тесселяции пространственного индекса для индексов, используемых в запросах ближайших соседей. Дополнительные сведения о пространственных индексах тесселяции см. в разделе "Пространственные данные".

Пример 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() указанным в разделе синтаксиса образом, поэтому данный запрос не может использовать пространственный индекс.