Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Защо тази заявка не използва правилния индекс?

Той не знае каква ще бъде стойността на променливите, когато компилира заявката. Можете да опитате OPTION (RECOMPILE) .

Предполагам, че добавянето на AND клаузата в заявката (въпреки че логично тя изобщо не я прави по-селективна) трябва да подведе оптимизатора да оцени заявката с по-голяма селективност, като по този начин ви дава плана, който искате!

Казвате в коментарите, че версията без ExceptionDate =ExceptionDate се оценява на 88234.8 редове и версията с 8823.48

Обикновено при липса на използваема статистика SQL Server се връща към евристика, зависеща от типа оператор за сравнение в предиката.

Предполага се, че > предикатът ще върне 30% от редовете например и това = predicate ще върне 10% от редовете, така че изглежда, че просто прилага това директно към резултата от първата оценка. Интересно е, че не взема под внимание факта, че равните са срещу самата колона тук!

c.f. Най-добри практики за управление на статистика - Избягвайте използването на локални променливи в заявките



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Върнете всички файлови групи за текущата база данни в SQL Server

  2. SSRS - Поддържане на таблица с еднаква ширина при динамично скриване на колони?

  3. Как работи клаузата DISTINCT на SQL?

  4. Как да ограничите достъп на потребител до обекти само от една схема в SQL Server 2008?

  5. Връщане на процент от набор от резултати в SQL Server