Desde aquí :
Se deben cumplir los siguientes requisitos para que una consulta de vecino más cercano use un índice espacial:
- Debe haber un índice espacial en una de las columnas espaciales y el método STDistance() debe usar esa columna en las cláusulas WHERE y ORDERBY.
- La cláusula TOP no puede contener una instrucción PERCENT.
- La cláusula WHERE debe contener un método STDistance().
- Si hay varios predicados en la cláusula WHERE, el predicado que contiene el método STDistance() debe estar conectado mediante una conjunción AND con los otros predicados. El método STDistance() no puede estar en una parte opcional de la cláusula WHERE.
- La primera expresión en la cláusula ORDER BY debe usar el método STDistance().
- El orden de clasificación de la primera expresión STDistance() en la cláusula ORDER BY debe ser ASC.
- Se deben filtrar todas las filas para las que STDistance devuelve NULL.
Entonces, esto debería funcionar:
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
Puede verificar que esté usando el índice espacial incluso el WITH INDEX
se elimina la sugerencia.