Обнюхивание параметров обходных путей

8

В прошлом я использовал два метода, чтобы обойти проблемы с анализом параметров:

1) Использовать WITH RECOMPILE
2) Переназначить значения параметров локальным переменным и использовать их вместо параметров

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

Если это правда, есть ли различия между этими двумя методами или они по сути одинаковы? Один предпочтительнее другого?

Абе Мисслер
источник

Ответы:

3

Если вы можете предвидеть типичные значения, запускайте хранимую процедуру с такими значениями всякий раз, когда вы (повторно) создаете ее. План выполнения будет создан на основе этих значений и сохранен для будущего использования. Большинство моих .sqlфайлов хранимых процедур заканчиваются EXECкомандой с разумными значениями, как раз для этой цели (и для выявления основных ошибок в коде).

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

Джон на все руки
источник
4
  1. WITH RECOMPILE

Это немного кувалды. Он перекомпилирует каждое утверждение в модуле. Использование OPTION (RECOMPILE)операторов, чувствительных к параметрам, является более целенаправленным решением.

  1. Переназначить значения параметров локальным переменным и использовать их вместо параметров

Это имеет тот же эффект, что и OPTIMIZE FOR UNKNOWNт. Е. План создается на основе средних значений. План не перекомпилируется при каждом выполнении.

Для получения дополнительной информации, пожалуйста, смотрите мою статью « Обнаружение параметров», «Встраивание» и «Параметры RECOMPILE» .

Пол Уайт 9
источник