Preciso de um "tempo de inatividade" para atualizar um procedimento armazenado? (Devido ao erro "definição alterada")

8

Eu sempre pensei que atualizar um procedimento armazenado era algo que eu poderia fazer enquanto os usuários estavam usando o sistema ativamente.

No momento, estou testando uma atualização para um procedimento armazenado e, enquanto uma chamada de longa execução para o sproc estava sendo executada (havia mais de 4 minutos na chamada), atualizei o sproc. (Eu estava planejando tentar um plano de consulta diferente em uma janela separada.)

Quando voltei para a longa, tive este erro:

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

Esse erro parece indicar que qualquer sproc que está sendo executado ativamente falhará se a definição desse sproc for atualizada. (Eu pensei que, uma vez que um sproc começasse a correr, ele usaria esse plano pelo resto da corrida, apesar das alterações na definição.)

Isso é verdade? Preciso ter períodos de inatividade para atualizar a definição de um sproc?

Vaccano
fonte
3
A chamada do procedimento armazenado faz parte de uma transação maior? Ele tem algum código que remove bloqueios de esquema em alguma coisa? Em teoria, o alter deveria ser bloqueado. Você pode entrar em mais detalhes sobre o que o procedimento faz e do que faz parte?
Aaron Bertrand
@ Aaron Bertrand - é um discurso bastante benigno. Ele tem algumas chamadas principais selecionadas. Sem bloqueios ou outras coisas assim. A única coisa significativa é que ela possui algumas instruções "if" baseadas nos parâmetros. A execução real da consulta varia um pouco com base nos parâmetros. É chamado de um serviço .net.
Vaccano 16/01/19
2
Um procedimento "razoavelmente benigno" não deve levar quatro minutos para ser executado. O que está fazendo por todo esse tempo?
Aaron Bertrand
Você já tentou alterar proc <proc Name> WITH RECOMPILE? Esta é uma opção no nível do procedimento para definir o procedimento para recompilar após cada execução. Isso significa que o plano sempre será recompilado e, portanto, evita que os planos em cache sejam reutilizados.
Marmik
dba.stackexchange.com/questions/154939/… Você olhou para esta pergunta?
k010mb0

Respostas:

1

Sim, é verdade que você não deve alterar um procedimento armazenado em execução ativa, porque o SQL Server não gosta.

Quanto ao tempo de inatividade, bem, sim, você não deve fazer alterações nos procedimentos armazenados usados ​​com frequência em um ambiente de produção ocupado durante o horário de funcionamento como uma prática recomendada.

Randolph West
fonte