Depuis ici :
Les conditions suivantes doivent être remplies pour qu'une requête Voisin le plus proche utilise un index spatial :
- Un index spatial doit être présent sur l'une des colonnes spatiales et la méthode STDistance() doit utiliser cette colonne dans les clauses WHERE et ORDERBY.
- La clause TOP ne peut pas contenir d'instruction PERCENT.
- La clause WHERE doit contenir une méthode STDistance().
- S'il y a plusieurs prédicats dans la clause WHERE, alors le prédicat contenant la méthode STDistance() doit être connecté par une conjonction AND aux autres prédicats. La méthode STDistance() ne peut pas être dans une partie facultative de la clause WHERE.
- La première expression de la clause ORDER BY doit utiliser la méthodeSTDistance().
- L'ordre de tri pour la première expression STDistance() dans la clause ORDER BY doit être ASC.
- Toutes les lignes pour lesquelles STDistance renvoie NULL doivent être filtrées.
Donc, cela devrait fonctionner :
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
Vous pouvez vérifier qu'il utilise l'index spatial même le WITH INDEX
l'indice est supprimé.