Udostępnij za pośrednictwem


Wykonywanie zapytań dotyczących danych przestrzennych dla najbliższego sąsiada

Dotyczy:SQL ServerAzure SQL Databasepunkt końcowy analizy SQL w Microsoft FabricInstancja zarządzana SQL w Microsoft FabricMagazyn w Microsoft FabricBaza danych SQL w Microsoft Fabric

Typowym zapytaniem używanym z danymi przestrzennymi jest zapytanie najbliższego sąsiada. Zapytania najbliższego sąsiada służą do znajdowania najbliższych obiektów przestrzennych dla określonego obiektu przestrzennego. Na przykład lokalizator sklepów dla witryny internetowej często musi znajdować najbliższe lokalizacje sklepu w lokalizacji klienta.

Zapytanie najbliższego sąsiada można napisać w różnych prawidłowych formatach zapytania, ale w przypadku najbliższego sąsiada w celu użycia indeksu przestrzennego należy użyć następującej składni.

Składnia

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 ]  
[ ; ]  

Zapytania najbliższego sąsiada i indeksy przestrzenne

W programie SQL Server klauzule TOP i ORDER BY służą do wykonywania zapytania najbliższego sąsiada w kolumnach danych przestrzennych. Klauzula ORDER BY zawiera wywołanie metody STDistance() dla typu danych kolumny przestrzennej. Klauzula TOP wskazuje liczbę obiektów do zwrócenia w ramach zapytania.

Aby zapytanie najbliższego sąsiada mogło używać indeksu przestrzennego, należy spełnić następujące wymagania:

  1. Indeks przestrzenny musi być obecny w jednej z kolumn przestrzennych, a metoda STDistance() musi używać tej kolumny w klauzulach WHERE i ORDER BY.

  2. Klauzula TOP nie może zawierać instrukcji PERCENT.

  3. Klauzula WHERE musi zawierać metodę STDistance().

  4. Jeśli w klauzuli WHERE istnieje wiele predykatów, predykat zawierający metodę STDistance() musi być połączony za pomocą spójnika AND z innymi predykatami. Metoda STDistance() nie może znajdować się w opcjonalnej części klauzuli WHERE.

  5. Pierwsze wyrażenie w klauzuli ORDER BY musi używać metody STDistance().

  6. Kolejność sortowania dla pierwszego wyrażenia STDistance() w klauzuli ORDER BY musi być ASC.

  7. Wszystkie wiersze, dla których STDistance zwraca NULL muszą być odfiltrowane.

Ostrzeżenie

Metody, które przyjmują typy danych geografii lub geometrii jako argumenty, będą zwracać NULL, jeśli identyfikatory SRID nie są identyczne dla tych typów.

Zaleca się użycie nowych układów indeksu przestrzennego dla indeksów wykorzystywanych w zapytaniach o najbliższych sąsiadów. Aby uzyskać więcej informacji na temat tessellacji indeksu przestrzennego, zobacz Spatial Data.

Przykład 1

Poniższy przykład kodu przedstawia zapytanie najbliższego sąsiada, które może używać indeksu przestrzennego. W przykładzie użyto tabeli Person.Address w przykładowej bazie danych 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);  

Utwórz indeks przestrzenny w kolumnie SpatialLocation, aby zobaczyć, jak najbliższe zapytanie sąsiada używa indeksu przestrzennego. Aby uzyskać więcej informacji na temat tworzenia indeksów przestrzennych, zobacz tworzenie, modyfikowanie i usuwanie indeksów przestrzennych.

Przykład 2

Poniższy przykład kodu przedstawia zapytanie najbliższego sąsiada, które nie może używać indeksu przestrzennego.

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);  

Zapytanie nie zawiera klauzuli WHERE, która używa STDistance() w postaci określonej w sekcji składni, więc zapytanie nie może używać indeksu przestrzennego.