Копирование сохраненного плана выполнения процедуры в другую базу данных

Настройка:

Использование SQL Server 2008 R2.

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

Вопрос:

Как скопировать планы выполнения запроса из одной базы данных в другую (тестовую) базу данных?

Примечание.

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


person Nick Vaccaro    schedule 25.04.2013    source источник


Ответы (2)


Планы не переносимы, они привязаны к идентификаторам объектов. Вы можете использовать плагины, но они строго привязаны к базе данных. Что вам нужно сделать, так это протестировать восстановленную резервную копию той же базы данных. На восстановленной бэкапе можно использовать плангу. Но для соответствия физические характеристики машин должны быть похожими (процессоры, оперативная память, диски).

Но обычно не нужно прибегать к таким махинациям, как копирование планов. Если посмотреть на фактические планы выполнения, все ответы прямо здесь.

person Remus Rusanu    schedule 25.04.2013
comment
Имеет смысл. Проблема в том, что эти ошибки возникают очень и очень редко. Фактические планы выполнения показывают мне, что все работает нормально, и это полная чушь. В любом случае я могу запросить планы? - person Nick Vaccaro; 25.04.2013
comment
sys.dm_exec_query_stats - person Remus Rusanu; 25.04.2013

Вы пробовали использовать предложение OPTIMIZE FOR? С его помощью вы можете упростить настройку своей процедуры и без риска того, что план, который вы копируете из другой базы данных, будет неуместным из-за различий в этих базах данных (если копирование плана вообще возможно).

http://www.mssqltips.com/sqlservertip/1354/optimize-parameter-driven-queries-with-sql-server-optimize-for-hint/

person AdamL    schedule 25.04.2013
comment
Нет, но спасибо, что передали эту информацию. Я обязательно попробую. Будет ли фактический план выполнения отличаться, если я запущу один и тот же запрос с двумя разными значениями переменных OPTIMIZE FOR? - person Nick Vaccaro; 25.04.2013
comment
Не во всех случаях, но в основном да. Например, если у вас 10 миллионов строк, и ваш параметр используется для фильтрации индексированного столбца, где 1% значений - это «A», а 99% значений - «B», то ОПТИМИЗАЦИЯ ДЛЯ «A» сгенерирует план с поиском по индексу, и OPTIMIZE FOR 'B' даст вам сканирование. Но помните, что вам, вероятно, придется перекомпилировать процедуру, чтобы изменения вступили в силу. - person AdamL; 29.04.2013