sql >> Base de Datos >  >> RDS >> Sqlserver

El procesador de consultas no pudo producir un plan de consulta debido a las sugerencias definidas en esta consulta. Vuelva a enviar la consulta y sin usar SET FORCEPLAN

Desde aquí :

Se deben cumplir los siguientes requisitos para que una consulta de vecino más cercano use un índice espacial:

  1. Debe haber un índice espacial en una de las columnas espaciales y el método STDistance() debe usar esa columna en las cláusulas WHERE y ORDERBY.
  2. La cláusula TOP no puede contener una instrucción PERCENT.
  3. La cláusula WHERE debe contener un método STDistance().
  4. Si hay varios predicados en la cláusula WHERE, el predicado que contiene el método STDistance() debe estar conectado mediante una conjunción AND con los otros predicados. El método STDistance() no puede estar en una parte opcional de la cláusula WHERE.
  5. La primera expresión en la cláusula ORDER BY debe usar el método STDistance().
  6. El orden de clasificación de la primera expresión STDistance() en la cláusula ORDER BY debe ser ASC.
  7. Se deben filtrar todas las filas para las que STDistance devuelve NULL.

Entonces, esto debería 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

Puede verificar que esté usando el índice espacial incluso el WITH INDEX se elimina la sugerencia.