У меня есть план обслуживания, который выполняется на моем сервере SQL Server 2008 каждое утро до рабочего времени. Он был введен в действие несколько лет назад, чтобы помочь с некоторыми проблемами производительности. Проблема, которую я вижу, заключается в том, что после завершения индекса перестроения в одной из баз данных будет храниться процедура, которая пройдет от девяти секунд до запуска до семи минут.
Решение, которое я решил исправить, заключается в том, чтобы открыть SQL Management Studio и запустить:
EXEC sp_recompile N'stored_proc_name';
EXEC stored_prod_name @userId=579
После того, как я запустил это, SP исправляет себя и возвращается к работе менее девяти секунд.
Я попробовал пару различных путей для автоматизации этого, но он будет работать, только если я запустил его с моего компьютера через студию управления. Я попытался завершить его в небольшом исполняемом файле С#, который запускался через несколько минут после завершения задания индекса пересоединения, но это не сработало. Я также попытался создать задание SQL для запуска его на сервере после завершения задания индекса пересоединения, но это тоже не сработало. Его нужно запустить из студии управления.
Итак, два вопроса:
Спасибо, Майк
Это похоже на стандартное кэширование запросов-параметров на основе параметров. Трюк здесь обычно заключается в использовании подсказки OPTIMIZE FOR
/UNKNOWN
- либо для конкретного параметра, вызывающего проблему, либо просто для всех параметров. Это значительно снижает вероятность того, что значение параметра с смещенным распределением отрицательно повлияет на систему для других значений. Более экстремальный вариант (более полезный при использовании командного текста, не столь полезный при использовании хранимых процедур) заключается в том, чтобы вставлять значение непосредственно в TSQL, а не использовать параметр. Это... оказывает влияние, однако, и должно использоваться с осторожностью.
В вашем случае я подозреваю, что добавление:
OPTION (OPTIMIZE FOR (@userId UNKNOWN))
в конце вашего запроса это исправит.
OPTION (RECOMPILE)
иOPTIMIZE FOR UNKNOWN
.