Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego to zapytanie nie używa właściwego indeksu?

Nie wie, jaka będzie wartość zmiennych podczas kompilowania zapytania. Możesz spróbować OPTION (RECOMPILE) .

Zakładam, że dodanie AND klauzula w zapytaniu (chociaż logicznie rzecz biorąc, nie czyni go bardziej selektywnym) musi wprowadzić w błąd optymalizatora do oszacowania zapytania z większą selektywnością, dając w ten sposób pożądany plan!

W komentarzach mówisz, że wersja bez ExceptionDate = ExceptionDate szacuje się na 88234.8 wiersze i wersja z 8823.48

Generalnie przy braku użytecznych statystyk SQL Server powraca do heurystyki zależnej od typu operatora porównania w predykacie.

Zakłada, że ​​> predykat zwróci na przykład 30% wierszy i że = predykat zwróci 10% wierszy, więc wygląda na to, że po prostu stosuje to bezpośrednio do wyniku pierwszego oszacowania. Ciekawe, że nie bierze pod uwagę faktu, że równa się tutaj przeciwko samej kolumnie!

por. Najlepsze praktyki dotyczące zarządzania statystykami — unikaj używania zmiennych lokalnych w zapytaniach



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Drukowanie aktualnej wartości i poprzedniej wartości między zakresem dat

  2. Różnica między CTE a SubQuery?

  3. Znajdź minimalną i maksymalną wartość kolumny wspólnej kolumny we wszystkich tabelach w bazie danych SQL Server 2008

  4. SQL Server 2005 - Przestawianie danych bez sumy/liczby i dynamicznej listy wartości

  5. Jak mogę dowiedzieć się, jakie ograniczenie klucza obcego odwołuje się do tabeli w programie SQL Server?