こちら から :
空間インデックスを使用するには、最近傍クエリで次の要件を満たす必要があります。
- 空間インデックスは空間列の1つに存在する必要があり、STDistance()メソッドはWHERE句とORDERBY句でその列を使用する必要があります。
- TOP句にPERCENTステートメントを含めることはできません。
- WHERE句にはSTDistance()メソッドが含まれている必要があります。
- WHERE句に複数の述語がある場合、STDistance()メソッドを含む述語は、AND結合によって他の述語に接続する必要があります。 STDistance()メソッドをWHERE句のオプション部分に含めることはできません。
- ORDER BY句の最初の式では、STDistance()メソッドを使用する必要があります。
- ORDER BY句の最初のSTDistance()式の並べ替え順序は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
でも、空間インデックスを使用していることを確認できます。 ヒントが削除されます。