Я использую базу данных, разделенную на несколько баз данных, которые я буду называть «разделами».Каждый раздел содержит одну и ту же структуру данных за определенный месяц.Представление в верхней части всех разделов выполняет большое UNION
для извлечения данных, и каждая таблица каждого раздела имеет CHECK CONSTRAINT
на основе границ дат, что помогает оптимизатору запросов пропускать ненужные разделы для конкретного запроса между двумя датами.,Пока все работает нормально.
Однако, когда я отправляю запрос, скажем, WHERE [Date] > @StartDate
, @StartDate
- переменная, план запроса показывает, что каждый отдельный раздел принимает участие в UNION
,Я обнаружил, что некоторые источники советуют предпочитать параметры переменным, но происходит то же самое.Я даже изменил свой запрос в хранимую процедуру, передавая границы даты в качестве параметров, и добавил подсказку WITH RECOMPILE
, но не повезло.Выдача DBCC FREEPROCCACHE
тоже не помогла.
Я рассматриваю возможность использования динамических запросов, конкатенации запроса и параметров, поэтому я передаю литеральные границы даты, как мой лучший вариант здесь.Но это делает меня действительно несчастным (я думаю, вы понимаете, почему).Кроме того, даже если нет лучшего обходного пути, я бы хотел хотя бы понять, что происходит.