От тук :
Следните изисквания трябва да бъдат изпълнени, за да може заявка за най-близък съсед да използва пространствен индекс:
- Пространственият индекс трябва да присъства в една от пространствените колони и методът STDistance() трябва да използва тази колона в клаузите WHERE и ORDERBY.
- Клаузата TOP не може да съдържа израз PERCENT.
- Клаузата WHERE трябва да съдържа метод STDistance().
- Ако има множество предикати в клаузата WHERE, тогава предикатът, съдържащ метода STDistance(), трябва да бъде свързан чрез връзка И с другите предикати. Методът STDistance() не може да бъде в незадължителна част от клаузата WHERE.
- Първият израз в клаузата ORDER BY трябва да използва метода STDistance().
- Редът на сортиране за първия израз STDistance() в клаузата ORDER BY трябва да бъде ASC.
- Всички редове, за които STDistance връща NULL, трябва да бъдат филтрирани.
И така, това трябва да работи:
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
Можете да проверите дали използва интервалния индекс дори WITH INDEX
подсказката е премахната.