Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O processador de consultas não pôde produzir um plano de consulta devido às dicas definidas nesta consulta. Reenvie a consulta e sem usar SET FORCEPLAN


De aqui :

Os seguintes requisitos devem ser atendidos para que uma consulta do vizinho mais próximo use um índice espacial:
  1. 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.
  2. A cláusula TOP não pode conter uma instrução PERCENT.
  3. A cláusula WHERE deve conter um método STDistance().
  4. 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.
  5. A primeira expressão na cláusula ORDER BY deve usar o métodoSTDistance().
  6. A ordem de classificação da primeira expressão STDistance() na cláusula ORDER BY deve ser ASC.
  7. 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.