Я построил хранимую процедуру, которая находит кратчайший маршрут в компании со многими складами. Процедура активно используется системой. После многих оптимизаций, включая таблицы, оптимизированные для памяти, если я запускаю sp_BlitzCache, у меня появляется 2 предупреждения:
- Параметр Sniffing;
- Всего в вашем кэше 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 миллисекунд). Кроме того, у меня нет смелости процедуры без оптимизации памяти таблиц, потому что я не могу воспроизвести рабочую нагрузку на тестовых серверах.
Спасибо!