Как я могу убедиться, что сокращение разделов работает во время выполнения - PullRequest
1 голос
/ 26 ноября 2011

Допустим, у меня есть очень большая таблица, разделенная по дате с использованием диапазона по месяцам.

Я заметил, что запрос, который задает жесткое значение, выполнит правильное сокращение раздела в плане выполнения. (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" или что-то ....

Ответы [ 2 ]

4 голосов
/ 19 ноября 2012
  1. Используйте RECOMPILE подсказку запроса:
    OPTION(RECOMPILE)

  2. Убедитесь, что сравниваемый параметр и столбец имеют одинаковый тип данных:
    (WHERE DATE_KEY = @DATE_KEY)

0 голосов
/ 26 ноября 2011

Для перекомпиляции запроса используйте RECOMPILE подсказка запроса .

Проверьте перекомпиляция хранимых процедур для перекомпиляции хранимых процедур. Вы можете:

  • помечать как WITH RECOMPILE в определении хранимой процедуры - SQL Server будет перекомпилировать процедуру перед каждым выполнением; следить за падениями производительности, если хранимая процедура вызывается часто отметьте ПРОЦЕДУРА СОЗДАНИЯ
  • добавить WITH RECOMPILE в конце каждого оператора EXEC: EXEC sp_my_procedure WITH RECOMPILE
  • использовать sp_recompile для принудительной перекомпиляции при первом следующем выполнении

Кроме того, вы можете попробовать использовать подсказку RECOMPILE внутри вашей хранимой процедуры для конкретного запроса.

Не забудьте проверить производительность, потому что перекомпиляция стоит дорого.

...