Обход кешированных планов в SQL Server 2005 - PullRequest
0 голосов
/ 29 июля 2010

Может кто-нибудь объяснить, почему это работает. Вот сценарий. У меня есть сохраненный процесс, и он начинает работать медленно. Затем я выбираю параметр и объявляю переменную, в которой хранится его значение, и в процедуре использую объявленную переменную вместо параметра. Процесс значительно ускорится.

Я думаю, что это как-то связано с кэшированным планом и статистикой, но я не уверен. Является ли статистика устаревшей по мере роста и изменения базы данных, так что кешированный план оптимизируется для прошлого состояния данных, которое отличается от текущего состояния данных?

спасибо.

Ответы [ 2 ]

4 голосов
/ 29 июля 2010

То, что вы описываете, обычно называют анализом параметров , и, похоже, это проблема только SQL Server - никогда не было в Oracle IME, и я не знаю о проблеме в MySQL.Ссылка, которую я дал, хорошо решает проблему.

Помните, что статистика, используемая оптимизатором, не синхронизируется с изменениями данных - вам может понадобиться иногда запускать ОБНОВЛЕНИЕ СТАТИСТИКИ .

0 голосов
/ 29 июля 2010

При изменении ddl план выполнения хранимой процедуры удаляется из кэша, но, как сказал OMG Ponies, оптимизатор не отслеживает изменения данных.

Один из способов обойти эту проблему - использовать опцию With Recompileи процедура будет компилироваться каждый раз, когда вы ее запускаете.Другое возможное решение - периодически запускать процедуру sp_recompile, которая помечает хранимую процедуру для перекомпиляции.

...