SQL Server 2005 - ранее быстро выполняемый сохраненный процесс запускается медленно, пока не будет удален и воссоздан - PullRequest
0 голосов
/ 01 марта 2010

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

Мы обнаружили, что удаление и повторное выполнение процедуры приводит к ее повторному выполнению через несколько секунд.

Сама процедура содержит несколько внутренних объединений и пару левых внешних объединений - но ничего необычного.

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

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 02 марта 2010

В SQL Server есть то, что называется «сниффинг параметров». По сути, в первый раз, когда вы запускали sp в плане выполнения в созданной базе на основе значений, которые вы передали SP. Вы запускаете его снова с теми же значениями - это быстро, вы запускаете его с другими значениями, оно может стать очень медленным, если эти значения являются «плохими» для первоначально сгенерированного плана выполнения.

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

Вы также можете найти много хороших статей по этой теме, если вы включите в Google 'сниффинг параметров sql'.

0 голосов
/ 02 марта 2010

В дополнение к ответам, предоставленным на данный момент, ваш план выполнения будет опираться на статистику в базе данных.Если они не актуальны, то план выполнения не может быть оптимальным.Вы можете обновить статистику используя:

EXEC sp_updatestats
0 голосов
/ 01 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...