Причина в том, что оптимизатор запросов SQL Server не учитывает значения параметров при выборе индексов.
Таким образом, он не знает, выберет ли ваше предложение BETWEEN
1 строку, 10 строк или несколько строк, и, таким образом, выберет сканирование таблицы.
Когда вы встраиваете даты как литералы в оператор SQL, оптимизатор получает всю необходимую информацию для выбора правильных индексов.
Что вы можете сделать, это дать подсказки к запросу . Если вы знаете, что типичный вариант использования этого запроса будет включать несколько строк, например, промежуток в неделю, вы можете встроить эти знания в SQL:
SELECT * FROM SomeTable WHERE SomeDateColumn BETWEEN @StartDate AND @EndDate
OPTION (
OPTIMIZE FOR @StartDate = '<some date here>`,
@EndDate = '<some other date here>`
)
Вам также следует убедиться, что статистика недавно была пересчитана по индексам этой таблицы, чтобы оптимизатор запросов мог выбрать полезные индексы.