Какой тип данных "c.Received_Date"?
Если это не дата и время, тогда столбец будет преобразован в дату и время, потому что @ BeginDate / @ EndDate - это дата и время. Это известно как приоритет типа данных . Это включает в себя, если столбец smalldatetime (согласно ссылке), потому что datetime имеет почти самый высокий приоритет
С константами оптимизатор будет использовать тип данных столбца
Преобразование означает, что поиск по индексу не может использоваться в плане, что является причиной.
Изменить, увидев планы запросов
Что касается литералов, SQL Server определил, что поиск, за которым следует поиск по закладкам, является лучшим, поскольку значения являются литералами.
Как правило, поиск закладок стоит дорого (и, между прочим, это одна из причин, по которой мы используем индексы покрытия) для нескольких строк.
Для запроса, использующего переменные, он принял общий случай, поскольку при изменении значений он может повторно использовать план. Общий случай - избегать поиска по закладкам, и в этом случае у вас есть сканирование PK (кластерный индекс)
Узнайте больше о том, почему поиск по закладкам обычно является плохой вещью на Simple-talk
В этом случае, вы можете попробовать индексную подсказку, чтобы заставить его, но если диапазон слишком широкий, это будет очень медленно. или вы можете удалить SELECT *
(плохая практика в любом случае) и заменить на SELECT col1, col2 etc
и использовать индекс покрытия