Правило о том, когда использовать опцию WITH RECOMPILE

Я понимаю, что опция WITH RECOMPILE вынуждает оптимизатор перестраивать план запроса для хранимых процедур, но когда бы вы этого хотели?

Каковы некоторые практические правила при использовании опции WITH RECOMPILE а когда нет?

Каковы эффективные накладные расходы, связанные с простым размещением их на каждом звене?

13
задан MiXT4PE 10 July 2019 в 15:20
поделиться

4 ответа

Как другие сказали, Вы не хотите просто включать WITH RECOMPILE в каждый сохраненный proc как привычку. Таким образом Вы устранили бы одно из основных преимуществ хранимых процедур: то, что это сохраняет план запросов.

, Почему это - потенциально грандиозное предприятие? Вычисления плана запросов намного более интенсивны, чем компиляция обычного процессуального кодекса. Поскольку синтаксис SQL-оператора только указывает , что Вы хотите, и не (обычно) , как для получения его, который позволяет базе данных широкую степень гибкости при создании физического плана (то есть, пошаговые инструкции на самом деле собрать и изменить данные). Существует много "приемов", которые препроцессор запроса базы данных может сделать и выбор, он может сделать - какой порядок присоединиться к таблицам, который индексирует для использования, подать ли заявку WHERE пункты прежде или после соединений, и т.д.

Для простого оператора SELECT, это не могло бы иметь значения, но ни для какого нетривиального запроса, база данных собирается провести некоторое серьезное время (измеряемый в миллисекундах, в противоположность обычным микросекундам) для предложения оптимального плана. Для действительно сложных запросов это не может даже гарантировать оптимальный план, это должно просто использовать эвристику для предложения довольно хороший план. Таким образом, вынуждая это перекомпилировать каждый раз, Вы говорите этому, что это должно перейти тот процесс много раз, даже если бы план, который это получило прежде, был совершенно хорош.

В зависимости от поставщика, должны быть автоматические триггеры для перекомпиляции планов запросов - например, если статистические данные по таблице значительно изменяются (как, гистограмма значений в определенном столбце начинается равномерно распределенный, со временем становится очень скошенным), то DB должен заметить, что и перекомпилировали план. Но вообще говоря, реализаторы базы данных собираются быть более умными об этом в целом, чем Вы.

Как с чем-либо связанная производительность, не берите выстрелы в темноте; фигура, где узкие места - это, стоит 90% Вашей производительности и решает их сначала.

16
ответ дан Ian Varley 11 July 2019 в 01:20
поделиться
  • 1
    +1. Поставщик кэша также часто обеспечивает бобы JMX, которые можно попросить их собственной статистики – JB Nizet 4 November 2011 в 00:53

Помещение его на каждой хранимой процедуре НЕ является хорошей идеей, потому что компиляция плана запросов является относительно дорогой операцией, и Вы не будете видеть преимущества от планов запросов, кэшируемых и снова использованных.

случай динамического, где пункт, созданный в хранимой процедуре, может быть обработан с помощью sp_executesql для выполнения TSQL вместо того, чтобы добавить WITH RECOMPILE к хранимой процедуре.

Другое решение (SQL Server 2005 вперед) состоит в том, чтобы использовать подсказку с определенными параметрами с помощью эти OPTIMIZE FOR подсказка. Это работает хорошо, если значения в строках статичны.

SQL Server 2008 представил мало известной функции названный" OPTIMIZE FOR UNKNOWN":

Эта подсказка направляет оптимизатор запросов для использования стандартных алгоритмов, которые это всегда использовало, если никакие значения параметров не были переданы запросу вообще. В этом случае оптимизатор посмотрит на все доступные статистические данные для достижения определения того, каковы значения локальных переменных, используемых для генерации queryplan, должны быть, вместо того, чтобы смотреть на определенные значения параметров, которые были переданы запросу приложением.

14
ответ дан Mitch Wheat 11 July 2019 в 01:20
поделиться
  • 1
    Я смог решить проблему, таким образом, я уже отметил Ваше сообщение как ответ. Дополнительно я отредактировал свой вопрос также.Спасибо за помощь! – Jake 5 June 2011 в 15:59

Наиболее популярный способ использования состоит в том, когда у Вас мог бы быть динамический оператор Where в процедуре... Вы не захотите, чтобы тот конкретный план запросов был скомпилирован и сохранен для последующего выполнения, потому что это очень хорошо не мог бы быть тот же самый пункт в следующий раз, когда процедуру называют.

2
ответ дан Gunny 11 July 2019 в 01:20
поделиться
  • 1
    До " некоторый background" я don' t видят, как то, что Вы говорите, корректно. Посмотрите здесь pastebin.com/raw.php?i=t60teCTk Попытка cmd/s/c " " c:\program files\replace.exe" > " c:\temp\my folder\a.a"" теперь удалите/s, и он все еще работает. Так what' s точка в/S? – barlop 21 December 2012 в 02:57

Это должно только использоваться, когда тестирование с reprentative данными и контекстом демонстрирует, что обхождение без производит недопустимые планы запросов (независимо от того, что возможные причины могли бы быть). Не принимайте заранее (не тестируя), который SP не оптимизирует правильно.

Единственное исключение для ручного вызова только (т.е. не кодируют его в SP): Когда Вы знаете о существенном изменении символа целевых таблиц. например, Усеченные, объемные загрузки, и т.д.

Это - еще одна возможность для преждевременной оптимизации.

Примечание: у Меня есть много точек. Если newby отправляет тот же ответ ниже, и Вы соглашаетесь, upvote их.

1
ответ дан dkretz 11 July 2019 в 01:20
поделиться
  • 1
    @Ben, Но как Harry указывает, и я наблюдал то же самое, и согласуйте, см. мои комментарии и ответ на тот вопрос stackoverflow.com/questions/355988/… /S в том вопросе, кажется, избыточен. Можно ли показать пример, где/S полезен и выполняет функцию? Действительно для cmd.exe/s/c " c:\program files\blah.exe.." it' s бесполезный и выполняет функцию (когда можно было бы заключить путь в кавычки и не хотел бы сохранить пробелы?).But, где это полезно и функционально? В случаях добавления внешних кавычек/S ничего не делает. – barlop 21 December 2012 в 03:03
Другие вопросы по тегам:

Похожие вопросы: