sql >> Databáze >  >> RDS >> Sqlserver

Procesor dotazu nemohl vytvořit plán dotazů kvůli radám definovaným v tomto dotazu. Odešlete dotaz znovu a bez použití SET FORCEPLAN

Z zde :

Aby mohl dotaz Nearest Neighbor používat prostorový index, musí být splněny následující požadavky:

  1. Prostorový index musí být přítomen na jednom z prostorových sloupců a metoda STDistance() musí tento sloupec používat v klauzulích WHERE a ORDERBY.
  2. Klauzule TOP nemůže obsahovat výraz PERCENT.
  3. Klauzule WHERE musí obsahovat metodu STDistance().
  4. Pokud je v klauzuli WHERE více predikátů, musí být predikát obsahující metodu STDistance() spojen s ostatními predikáty spojením AND. Metoda STDistance() nemůže být ve volitelné části klauzule WHERE.
  5. První výraz v klauzuli ORDER BY musí používat metodu STDistance().
  6. Pořadí řazení pro první výraz STDistance() v klauzuli ORDER BY musí být ASC.
  7. Všechny řádky, pro které STDistance vrací hodnotu NULL, musí být odfiltrovány.

Takže by to mělo fungovat:

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

Můžete zkontrolovat, že používá prostorový index, dokonce i WITH INDEX nápověda je odstraněna.



  1. Pomalý poddotaz v MySQL

  2. Jak vytvořit databázi MySQL pomocí rozhraní příkazového řádku (CLI)

  3. Definovat názvy tabulek a sloupců jako argumenty ve funkci plpgsql?

  4. Správná syntaxe připravených příkazů