Van hier :
Er moet aan de volgende vereisten worden voldaan voordat een Nearest Neighbor-query een ruimtelijke index kan gebruiken:
- Er moet een ruimtelijke index aanwezig zijn op een van de ruimtelijke kolommen en de methode STDistance() moet die kolom gebruiken in de WHERE- en ORDERBY-clausules.
- De TOP-clausule mag geen PERCENT-instructie bevatten.
- De WHERE-component moet een STDistance()-methode bevatten.
- Als er meerdere predikaten zijn in de WHERE-clausule, moet het predikaat dat de STDistance()-methode bevat, worden verbonden door een AND-conjunctie met de andere predikaten. De methode STDistance() mag niet in een optioneel deel van de WHERE-component staan.
- De eerste expressie in de ORDER BY-component moet de methode STDistance() gebruiken.
- Sorteervolgorde voor de eerste STDistance()-expressie in de ORDER BY-clausule moet ASC zijn.
- Alle rijen waarvoor STDistance NULL retourneert, moeten worden uitgefilterd.
Dit zou dus moeten werken:
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
U kunt controleren of het de ruimtelijke index gebruikt, zelfs de WITH INDEX
hint is verwijderd.