Da qui :
I seguenti requisiti devono essere soddisfatti affinché una query Nearest Neighbor possa utilizzare un indice spaziale:
- Un indice spaziale deve essere presente su una delle colonne spaziali e il metodo STDistance() deve utilizzare quella colonna nelle clausole WHERE e ORDERBY.
- La clausola TOP non può contenere un'istruzione PERCENT.
- La clausola WHERE deve contenere un metodo STDistance().
- Se sono presenti più predicati nella clausola WHERE, il predicato contenente il metodo STDistance() deve essere connesso tramite una giunzione AND agli altri predicati. Il metodo STDistance() non può trovarsi in una parte facoltativa della clausola WHERE.
- La prima espressione nella clausola ORDER BY deve utilizzare il metodo STDistance().
- L'ordinamento per la prima espressione STDistance() nella clausola ORDER BY deve essere ASC.
- Tutte le righe per le quali STDistance restituisce NULL devono essere filtrate.
Quindi, questo dovrebbe funzionare:
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
Puoi verificare che stia utilizzando l'indice spaziale anche il WITH INDEX
il suggerimento viene rimosso.