Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Query Processor non è stato in grado di produrre un piano di query a causa dei suggerimenti definiti in questa query. Invia nuovamente la query e senza utilizzare SET FORCEPLAN

Da qui :

I seguenti requisiti devono essere soddisfatti affinché una query Nearest Neighbor possa utilizzare un indice spaziale:

  1. Un indice spaziale deve essere presente su una delle colonne spaziali e il metodo STDistance() deve utilizzare quella colonna nelle clausole WHERE e ORDERBY.
  2. La clausola TOP non può contenere un'istruzione PERCENT.
  3. La clausola WHERE deve contenere un metodo STDistance().
  4. Se sono presenti più predicati nella clausola WHERE, il predicato contenente il metodo STDistance() deve essere connesso tramite una giunzione AND agli altri predicati. Il metodo STDistance() non può trovarsi in una parte facoltativa della clausola WHERE.
  5. La prima espressione nella clausola ORDER BY deve utilizzare il metodo STDistance().
  6. L'ordinamento per la prima espressione STDistance() nella clausola ORDER BY deve essere ASC.
  7. Tutte le righe per le quali STDistance restituisce NULL devono essere filtrate.

Quindi, questo dovrebbe funzionare:

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

Puoi verificare che stia utilizzando l'indice spaziale anche il WITH INDEX il suggerimento viene rimosso.