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

Proč tento dotaz nepoužívá správný index?

Při sestavování dotazu neví, jakou hodnotu budou mít proměnné. Můžete zkusit OPTION (RECOMPILE) .

Předpokládám, že přidání AND klauzule v dotazu (i když logicky není vůbec selektivnější) musí optimalizátora uvést v omyl, aby odhadl dotaz s větší selektivitou, čímž vám poskytne plán, který jste chtěli!

V komentářích uvádíte, že verze bez ExceptionDate = ExceptionDate se odhaduje na 88234.8 řádky a verzi s 8823.48

Obecně se při absenci použitelných statistik SQL Server vrací zpět k heuristice v závislosti na typu operátoru porovnání v predikátu.

Předpokládá, že > predikát vrátí například 30 % řádků a že = predikát vrátí 10 % řádků, takže to vypadá, že to pouze aplikuje přímo na výsledek prvního odhadu. Zajímavé, že nebere v úvahu fakt, že rovný je zde proti samotnému sloupci!

c.f. Doporučené postupy pro správu statistik – Vyhněte se použití místních proměnných v dotazech



  1. Najmout nebo najmout:Datový model pro proces náboru

  2. Příznaky nad hlavou pozorovatele a typu čekání

  3. jak vložit do tabulky (col1, col2) hodnoty (vyberte max(id) z tabulky2, vyberte id z tabulky3); ?

  4. Počáteční situace s oracle (podkladové dotazy)