Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
punkt końcowy analizy SQL w Microsoft Fabric
Instancja zarządzana SQL w Microsoft Fabric
Magazyn w Microsoft Fabric
Baza 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:
Indeks przestrzenny musi być obecny w jednej z kolumn przestrzennych, a metoda
STDistance()
musi używać tej kolumny w klauzulachWHERE
iORDER BY
.Klauzula
TOP
nie może zawierać instrukcjiPERCENT
.Klauzula
WHERE
musi zawierać metodęSTDistance()
.Jeśli w klauzuli
WHERE
istnieje wiele predykatów, predykat zawierający metodęSTDistance()
musi być połączony za pomocą spójnikaAND
z innymi predykatami. MetodaSTDistance()
nie może znajdować się w opcjonalnej części klauzuliWHERE
.Pierwsze wyrażenie w klauzuli
ORDER BY
musi używać metodySTDistance()
.Kolejność sortowania dla pierwszego wyrażenia
STDistance()
w klauzuliORDER BY
musi byćASC
.Wszystkie wiersze, dla których
STDistance
zwracaNULL
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.