Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Der Abfrageprozessor konnte aufgrund der in dieser Abfrage definierten Hinweise keinen Abfrageplan erstellen. Senden Sie die Abfrage erneut und ohne SET FORCEPLAN zu verwenden

Von hier :

Die folgenden Anforderungen müssen erfüllt sein, damit eine Nearest Neighbor-Abfrage einen räumlichen Index verwenden kann:

  1. Ein räumlicher Index muss für eine der räumlichen Spalten vorhanden sein, und die STDistance()-Methode muss diese Spalte in den WHERE- und ORDERBY-Klauseln verwenden.
  2. Die TOP-Klausel darf keine PERCENT-Anweisung enthalten.
  3. Die WHERE-Klausel muss eine STDistance()-Methode enthalten.
  4. Wenn mehrere Prädikate in der WHERE-Klausel vorhanden sind, muss das Prädikat, das die STDistance()-Methode enthält, durch eine UND-Verknüpfung mit den anderen Prädikaten verbunden werden. Die Methode STDistance() darf nicht in einem optionalen Teil der WHERE-Klausel stehen.
  5. Der erste Ausdruck in der ORDER BY-Klausel muss die STDistance()-Methode verwenden.
  6. Sortierreihenfolge für den ersten STDistance()-Ausdruck in der ORDER BY-Klausel muss ASC sein.
  7. Alle Zeilen, für die STDistance NULL zurückgibt, müssen herausgefiltert werden.

Das sollte also funktionieren:

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

Sie können überprüfen, ob es den räumlichen Index verwendet, sogar den WITH INDEX Hinweis wurde entfernt.