Z tutaj :
Aby zapytanie najbliższego sąsiada używało indeksu przestrzennego, muszą być spełnione następujące wymagania:
- Indeks przestrzenny musi być obecny w jednej z kolumn przestrzennych, a metoda STDistance() musi używać tej kolumny w klauzulach WHERE i ORDERBY.
- Klauzula TOP nie może zawierać instrukcji PERCENT.
- Klauzula WHERE musi zawierać metodę STDistance().
- Jeśli w klauzuli WHERE występuje wiele predykatów, predykat zawierający metodę STDistance() musi być połączony z innymi predykatami za pomocą łącznika AND. Metoda STDistance() nie może znajdować się w opcjonalnej części klauzuli WHERE.
- Pierwsze wyrażenie w klauzuli ORDER BY musi używać metody STDistance().
- Porządek sortowania dla pierwszego wyrażenia STDistance() w klauzuli ORDER BY musi być ASC.
- Wszystkie wiersze, dla których STDistance zwraca NULL, muszą zostać odfiltrowane.
To powinno działać:
DECLARE @g geography;
declare @point nvarchar(50) =''
declare @i int =0,
@lat decimal(8,6) =0.0,
@long decimal(8,6) =0.0,
@start datetime = getdate()
set @lat =(select (0.9 -Rand()*1.8)*100)
set @long =(select (0.9 -Rand()*1.8)*100)
set @point = (select 'POINT('+CONVERT(varchar(10), @lat)+ ' '
+CONVERT(varchar(10), @long)+')')
SET @g = geography::STGeomFromText(@point, 4326);
SELECT TOP 1000
@lat,
@long,
@g.STDistance(st.[coord]) AS [DistanceFromPoint (in meters)]
, st.[coord]
, st.id
FROM Temp st with(index([SpatialIndex_1]))
WHERE @g.STDistance(st.[coord]) IS NOT NULL
ORDER BY @g.STDistance(st.[coord]) asc
Możesz sprawdzić, czy używa indeksu przestrzennego, nawet WITH INDEX
wskazówka została usunięta.