Я всегда думал, что обновление хранимой процедуры - это то, что я могу сделать, пока пользователи активно используют систему.
Но в настоящее время я тестирую обновление хранимой процедуры, и, пока выполнялся длительный вызов sproc (прошло более 4 минут с момента вызова), я обновил sproc. (Я планировал попробовать другой план запроса в отдельном окне.)
Когда я вернулся к долгосрочному, у меня была эта ошибка:
The definition of object 'MySprocName' has changed since it was compiled.
Кажется, эта ошибка говорит о том, что любой sproc, который активно выполняется, потерпит неудачу, если определение этого sproc будет обновлено. (Я думал, что после запуска sproc он будет использовать этот план до конца выполнения, несмотря на изменения в определении.)
Это правда? Нужно ли иметь время простоя, чтобы обновить определение sproc?
WITH RECOMPILE
? Это опция уровня процедуры, позволяющая перекомпилировать процедуру после каждого запуска. Это означает, что план всегда будет перекомпилироваться и, следовательно, избегать повторного использования кэшированных планов.Ответы:
Да, это правда, что вы не должны изменять активно запущенную хранимую процедуру, потому что SQL Server это не нравится.
Что касается простоя, ну да, вы не должны вносить изменения в часто используемые хранимые процедуры в загруженной производственной среде во время работы в качестве передовой практики.
источник