Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Le processeur de requêtes n'a pas pu produire de plan de requête en raison des conseils définis dans cette requête. Soumettre à nouveau la requête et sans utiliser SET FORCEPLAN

Depuis ici :

Les conditions suivantes doivent être remplies pour qu'une requête Voisin le plus proche utilise un index spatial :

  1. Un index spatial doit être présent sur l'une des colonnes spatiales et la méthode STDistance() doit utiliser cette colonne dans les clauses WHERE et ORDERBY.
  2. La clause TOP ne peut pas contenir d'instruction PERCENT.
  3. La clause WHERE doit contenir une méthode STDistance().
  4. S'il y a plusieurs prédicats dans la clause WHERE, alors le prédicat contenant la méthode STDistance() doit être connecté par une conjonction AND aux autres prédicats. La méthode STDistance() ne peut pas être dans une partie facultative de la clause WHERE.
  5. La première expression de la clause ORDER BY doit utiliser la méthodeSTDistance().
  6. L'ordre de tri pour la première expression STDistance() dans la clause ORDER BY doit être ASC.
  7. Toutes les lignes pour lesquelles STDistance renvoie NULL doivent être filtrées.

Donc, cela devrait fonctionner :

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

Vous pouvez vérifier qu'il utilise l'index spatial même le WITH INDEX l'indice est supprimé.