Допустим, у меня есть очень большая таблица, разделенная по дате с использованием диапазона по месяцам.
Я заметил, что запрос, который задает жесткое значение, выполнит правильное сокращение раздела в плане выполнения. (WHERE DATE_KEY = '1/1/2011'
). Это будет сканировать только раздел этого месяца.
Но я заметил, что когда я использую переменную (WHERE DATE_KEY = @DATE_KEY)
, скажем, в хранимой процедуре, SQL Server будет сканировать все разделы.
Таким образом, SQL Server выполняет сокращение разделов при кэшировании плана выполнения, а не во время выполнения. Что не идеально.
Обходной путь, который я нашел, - использовать вместо него динамический SQL EXEC('...WHERE DATE_KEY=''' + @DATE_KEY+ '''')
. Который работает, но не очень элегантно.
Так что мне было интересно, есть ли где-нибудь переключатель или какой-нибудь параметр, который я могу использовать, чтобы заставить эту работу работать правильно, не проходя динамический SQL. Скажите какое-нибудь гипотетическое "SET COMPILE_PLAN_AT_RUNTIME ON"
или что-то ....