Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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
Azure SQL Managed Instance
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Magazyn w usłudze Microsoft Fabric
Baza danych SQL w usłudze 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.
Syntax
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 klauzulachWHEREiORDER BY.Klauzula
TOPnie może zawierać instrukcjiPERCENT.Klauzula
WHEREmusi zawierać metodęSTDistance().Jeśli w klauzuli
WHEREistnieje wiele predykatów, predykat zawierający metodęSTDistance()musi być połączony za pomocą spójnikaANDz innymi predykatami. MetodaSTDistance()nie może znajdować się w opcjonalnej części klauzuliWHERE.Pierwsze wyrażenie w klauzuli
ORDER BYmusi używać metodySTDistance().Kolejność sortowania dla pierwszego wyrażenia
STDistance()w klauzuliORDER BYmusi byćASC.Wszystkie wiersze, dla których
STDistancezwracaNULLmuszą być odfiltrowane.
Warning
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 AdventureWorks2025.
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.