Той не знае каква ще бъде стойността на променливите, когато компилира заявката. Можете да опитате OPTION (RECOMPILE)
.
Предполагам, че добавянето на AND
клаузата в заявката (въпреки че логично тя изобщо не я прави по-селективна) трябва да подведе оптимизатора да оцени заявката с по-голяма селективност, като по този начин ви дава плана, който искате!
Казвате в коментарите, че версията без ExceptionDate =ExceptionDate
се оценява на 88234.8
редове и версията с 8823.48
Обикновено при липса на използваема статистика SQL Server се връща към евристика, зависеща от типа оператор за сравнение в предиката.
Предполага се, че >код> предикатът ще върне 30% от редовете например и това
=
predicate ще върне 10% от редовете, така че изглежда, че просто прилага това директно към резултата от първата оценка. Интересно е, че не взема под внимание факта, че равните са срещу самата колона тук!