Есть ли недостатки в WITH RECOMPILE для ежемесячных хранимых процессов SQL Server?

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

Если базовые индексы, статистика или представления изменяются администратором базы данных, я не хочу, чтобы кому-то приходилось входить и принудительно перекомпилировать SP с помощью ALTER или чего-то еще.

Есть ли в этом недостаток?


person Cade Roux    schedule 04.12.2008    source источник


Ответы (3)


В данных обстоятельствах это было бы совершенно безвредно и, вероятно, было бы хорошей идеей.

person dkretz    schedule 04.12.2008

Насколько я понимаю, SP должен перекомпилироваться при необходимости автоматически. Так что ваше беспокойство по поводу основных изменений на самом деле не имеет значения.

Однако сервер пытается кэшировать скомпилированные планы SP. Использование WITH RECOMPILE освободит память, которая использовалась бы для кэширования скомпилированных процедур (по крайней мере, до следующей очистки кэша). Поскольку они запускаются только ежемесячно, это кажется хорошей идеей.

Кроме того, вы можете просмотреть эту статью по другой причине, чтобы использовать эту директиву:
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5662581.html

person Joel Coehoorn    schedule 04.12.2008
comment
Что, если появятся более новые и лучшие индексы, которые он мог бы использовать, или если появится новая статистика, старые планы будут автоматически отброшены? - person Cade Roux; 05.12.2008
comment
Нет, единственный случай, когда план может быть признан недействительным, — это изменение индексов или статистики, используемых планом. Дополнительную информацию о том, что делает планы недействительными, см. в разделе Кэширование и повторное использование планов выполнения (найдите кэш процедур в указателе) в разделе Перекомпиляция планов выполнения в электронной документации. - person Jim McLeod; 05.12.2008

Если каждая хранимая процедура запускается только один раз в месяц, маловероятно, что скомпилированная процедура все еще будет находиться в кэше процедур. Фактически он будет перекомпилирован в любом случае.

Даже если вы запускаете одну и ту же хранимую процедуру 100 раз в отчетный день, компиляция каждый раз будет занимать всего 0-2 секунды (в зависимости от сложности хранимой процедуры), так что это не большие накладные расходы. Я бы чувствовал себя комфортно, установив WITH RECOMPILE для этих хранимых процедур.

person Jim McLeod    schedule 04.12.2008
comment
Правильно - я думаю, что время перекомпиляции всегда незначительно по сравнению со временем выполнения - и время выполнения ограничивает меня от запуска этих процессов так часто, что это может даже быть фактором. - person Cade Roux; 05.12.2008