Много планов запросов для хранимой процедуры - PullRequest
1 голос
/ 11 марта 2019

Я построил хранимую процедуру, которая находит кратчайший маршрут в компании со многими складами. Процедура активно используется системой. После многих оптимизаций, включая таблицы, оптимизированные для памяти, если я запускаю sp_BlitzCache, у меня появляется 2 предупреждения:

  1. Параметр Sniffing;
  2. Всего в вашем кэше 83866 планов: 100,00% планов создано за последние 24 часа, 100,00% создано за последние 4 часа и 100,00% создано за последние 1 час.

Процедура вызывается только с параметрами (без жестко заданных значений). Вы можете найти здесь план запроса: https://www.brentozar.com/pastetheplan/?id=r1rW59QvN.

Я действительно не понимаю, почему движок генерирует для каждого выполнения план и что я должен проверить. Кроме того, sp_BlitzCache сообщает Мы не смогли найти план для этого запроса. Возможные причины этого включают динамический SQL, подсказки RECOMPILE и зашифрованный код. У меня нет ни динамического SQL, ни подсказок перекомпиляции, ни зашифрованного кода.

Что я должен проверить?

UPDATE

Я проверил влияние этой процедуры на сервер, как предложил Джероен Мостерт в комментариях (спасибо за ваш ответ!), И эта процедура использует 0,66% из 10 лучших процедур на сервере относительно среднего IO, но это единственная процедура без плана, поэтому остается вопрос: почему так много планов?

Я не пытался запустить хранимую процедуру без таблиц, оптимизированных для памяти. Мне пришлось использовать их, потому что процесс должен работать так же быстро, как и молнии (и в некоторых случаях он работает менее 30 миллисекунд). Кроме того, у меня нет смелости процедуры без оптимизации памяти таблиц, потому что я не могу воспроизвести рабочую нагрузку на тестовых серверах.

Спасибо!

...