Страницы

Поиск по вопросам

среда, 17 октября 2018 г.

Использование флага в процедурах 'WITH RECOMPILE'

Привет . Можно на практических примерах показать инсткукции когда нужно принудительно делать RECOMPILE для процедуры ? Буду благодарен.


Ответ

Единственная причина делать Recompile (вызовом sp_recompile) - это когда текущий скопмилированный план вас не устраивает.
Единственная реальная причина, по которой план вас может не устривать - сработавший механизм parameters sniffing - компиляция процедуры под набор параметров, переданных ей при первом вызове. Вредные случаи Parameters sniffing чинятся
parameter hiding - перекладываением параметров в локальные переменные перед использованием (олдскульный способ). добавлением хинтов OPTIMIZE FOR - например, OPTIMIZE FOR (@parameter UNKNOWN)
Любой из способов убирает необходимость в ручной (sp_recompile) или постоянной (WITH RECOMPILE, OPTION (RECOMPILE)) рекомпиляции.
Так что для Recompile остается только одно применение - быстрого костыля, на время пока вчитываешься в кривой план и думаешь "omg, какие еще nested loops, там же миллион записей, продакшн уже час тормозит, почему алерты не сработали, apdex же ниже плинтуса, вроде ж статистика должна была пересчитаться, какого черта там estimated rows 3, чего оно полезло в этот индекс, что за индусы писали оптимизатор, если это для него plan good enough, куда поставить хинты?).
Причин же для использования WITH RECOMPILE нет. Совсем.
Хорошая длинная статья о рекомпияции на английском - Parameter Sniffing, Embedding, and the RECOMPILE Options

Комментариев нет:

Отправить комментарий