Från här :
Följande krav måste uppfyllas för att en Nearest Neighbor-fråga ska kunna använda ett rumsligt index:
- Ett rumsligt index måste finnas på en av de rumsliga kolumnerna och metoden STDistance() måste använda den kolumnen i WHERE- och ORDERBY-satserna.
- TOP-satsen kan inte innehålla en PERCENT-sats.
- WHERE-satsen måste innehålla en STDistance()-metod.
- Om det finns flera predikat i WHERE-satsen måste predikatet som innehåller metoden STDistance() kopplas till de andra predikaten med en AND-konjunktion. STDistance()-metoden kan inte finnas i en valfri del av WHERE-satsen.
- Det första uttrycket i ORDER BY-satsen måste använda metoden STDistance().
- Sorteringsordningen för det första STDistance()-uttrycket i ORDER BY-satsen måste vara ASC.
- Alla rader för vilka STDistance returnerar NULL måste filtreras bort.
Så det här borde fungera:
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
Du kan kontrollera att den använder det rumsliga indexet även WITH INDEX
ledtråd tas bort.