sql >> Database >  >> RDS >> Sqlserver

Queryprocessor kan geen queryplan produceren vanwege de hints die in deze query zijn gedefinieerd. Dien de vraag opnieuw in en zonder SET FORCEPLAN te gebruiken

Van hier :

Er moet aan de volgende vereisten worden voldaan voordat een Nearest Neighbor-query een ruimtelijke index kan gebruiken:

  1. Er moet een ruimtelijke index aanwezig zijn op een van de ruimtelijke kolommen en de methode STDistance() moet die kolom gebruiken in de WHERE- en ORDERBY-clausules.
  2. De TOP-clausule mag geen PERCENT-instructie bevatten.
  3. De WHERE-component moet een STDistance()-methode bevatten.
  4. Als er meerdere predikaten zijn in de WHERE-clausule, moet het predikaat dat de STDistance()-methode bevat, worden verbonden door een AND-conjunctie met de andere predikaten. De methode STDistance() mag niet in een optioneel deel van de WHERE-component staan.
  5. De eerste expressie in de ORDER BY-component moet de methode STDistance() gebruiken.
  6. Sorteervolgorde voor de eerste STDistance()-expressie in de ORDER BY-clausule moet ASC zijn.
  7. Alle rijen waarvoor STDistance NULL retourneert, moeten worden uitgefilterd.

Dit zou dus moeten werken:

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

U kunt controleren of het de ruimtelijke index gebruikt, zelfs de WITH INDEX hint is verwijderd.



  1. MySQL:hoe de woorden in een string te sorteren met behulp van een opgeslagen functie?

  2. Hoe een sommatie te krijgen met een telling groter dan een bepaald bedrag

  3. Implementatie van het Hacker News ranking-algoritme in SQL

  4. Hoe te controleren of het bestand een afbeelding is met PL/SQL?