Нужно ли мне «время простоя» для обновления хранимой процедуры? (Из-за ошибки «определение изменено»)


8

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

Но в настоящее время я тестирую обновление хранимой процедуры, и, пока выполнялся длительный вызов sproc (прошло более 4 минут с момента вызова), я обновил sproc. (Я планировал попробовать другой план запроса в отдельном окне.)

Когда я вернулся к долгосрочному, у меня была эта ошибка:

The definition of object 'MySprocName' has changed since it was compiled.

Кажется, эта ошибка говорит о том, что любой sproc, который активно выполняется, потерпит неудачу, если определение этого sproc будет обновлено. (Я думал, что после запуска sproc он будет использовать этот план до конца выполнения, несмотря на изменения в определении.)

Это правда? Нужно ли иметь время простоя, чтобы обновить определение sproc?


3
Является ли вызов хранимой процедуры частью более крупной транзакции? Есть ли какой-нибудь код, который снимает блокировки схемы на чем-либо? Теоретически, изменение должно быть просто заблокировано. Не могли бы вы подробнее рассказать о том, что делает эта процедура и в чем она состоит?
Аарон Бертран

@aaron Bertrand - это довольно мягкий спрок. У этого есть некоторые избранные главные звонки. Никаких замков или подобных вещей. Единственное, что является важным, - это то, что он имеет некоторые операторы «если» на основе параметров. Фактический прогон запроса немного варьируется в зависимости от параметров. Он вызывается из службы .net.
Ваккано

2
«Довольно мягкая» процедура не должна занимать четыре минуты. Что он делает все это время?
Аарон Бертран

Вы пробовали изменить proc <proc name> WITH RECOMPILE? Это опция уровня процедуры, позволяющая перекомпилировать процедуру после каждого запуска. Это означает, что план всегда будет перекомпилироваться и, следовательно, избегать повторного использования кэшированных планов.
MarmiK

dba.stackexchange.com/questions/154939/… Вы смотрели на этот вопрос?
k010mb0

Ответы:


1

Да, это правда, что вы не должны изменять активно запущенную хранимую процедуру, потому что SQL Server это не нравится.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.