De aqui :
Os seguintes requisitos devem ser atendidos para que uma consulta do vizinho mais próximo use um índice espacial:
- Um índice espacial deve estar presente em uma das colunas espaciais e o método STDistance() deve usar essa coluna nas cláusulas WHERE e ORDERBY.
- A cláusula TOP não pode conter uma instrução PERCENT.
- A cláusula WHERE deve conter um método STDistance().
- Se houver vários predicados na cláusula WHERE, o predicado que contém o método STDistance() deve ser conectado por uma conjunção AND aos outros predicados. O método STDistance() não pode estar em uma parte opcional da cláusula WHERE.
- A primeira expressão na cláusula ORDER BY deve usar o métodoSTDistance().
- A ordem de classificação da primeira expressão STDistance() na cláusula ORDER BY deve ser ASC.
- Todas as linhas para as quais STDistance retorna NULL devem ser filtradas.
Então, isso deve 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
Você pode verificar se está usando o índice espacial mesmo o
WITH INDEX
dica é removida.