Ho bisogno di un "tempo morto" per aggiornare una procedura memorizzata? (A causa dell'errore "definizione modificata")


8

Ho sempre pensato che l'aggiornamento di una procedura memorizzata fosse qualcosa che potevo fare mentre gli utenti utilizzavano attivamente il sistema.

Ma attualmente sto testando un aggiornamento di una procedura memorizzata e durante l'esecuzione di una chiamata a lunga durata allo sproc (sono stati 4+ minuti nella chiamata), ho aggiornato lo sproc. (Avevo intenzione di provare un piano di query diverso in una finestra separata.)

Quando sono tornato a quello di lunga durata, ho avuto questo errore:

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

Questo errore sembra dire che qualsiasi sproc che viene eseguito attivamente fallirà se la definizione di quello sproc viene aggiornata. (Ho pensato che una volta che uno sproc ha iniziato a funzionare, avrebbe usato quel piano per il resto della corsa nonostante le modifiche alla definizione.)

È vero? Devo avere tempi di inattività per aggiornare la definizione di uno sproc?


3
La chiamata della procedura memorizzata fa parte di una transazione più ampia? Ha qualche codice che elimina i blocchi dello schema su qualcosa? In teoria, l'alterazione dovrebbe essere bloccata. Puoi approfondire cosa fa la procedura e di cosa fa parte?
Aaron Bertrand

@aaron Bertrand - è uno sproc abbastanza benigno. Ha alcune chiamate top selezionate. Nessun lucchetto o altre cose del genere. L'unica cosa significativa è che ha alcune istruzioni "if" basate sui parametri. L'esecuzione effettiva della query varia leggermente in base ai parametri. Viene chiamato da un servizio .net.
Vaccano,

2
Una procedura "abbastanza benigna" non dovrebbe richiedere quattro minuti per l'esecuzione. Cosa sta facendo per tutto quel tempo?
Aaron Bertrand

Hai provato a modificare proc <nome proc> WITH RECOMPILE? Questa è un'opzione a livello di procedura per impostare la procedura da ricompilare dopo ogni esecuzione. Ciò significa che il piano si ricompilerà sempre, evitando così di riutilizzare i piani memorizzati nella cache.
MarmiK,

Risposte:


1

Sì, è vero che non è necessario modificare una procedura memorizzata in esecuzione attiva, poiché a SQL Server non piace.

Per quanto riguarda i tempi di inattività, beh sì, non dovresti apportare modifiche alle procedure memorizzate utilizzate di frequente in un ambiente di produzione occupato durante le ore di funzionamento come best practice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.