Ottimizzazione: spostamento delle dichiarazioni delle variabili all'inizio della procedura


15

Mentre lavoravo sull'ottimizzazione di alcune procedure memorizzate, mi sono seduto con il DBA e ho seguito alcune procedure memorizzate con elevato blocco e / o alta attività di lettura / scrittura.

Una cosa che il DBA ha menzionato è che dovrei dichiarare tutte le variabili (specialmente TABLEquelle) all'inizio della procedura memorizzata per evitare ricompilazioni.

Questo è il primo che ho sentito parlare di questo e stavo cercando una conferma prima di rivisitare tutte le diverse procedure memorizzate che abbiamo. Lo chiamava "visualizzazione tardiva del codice" e la ricompilazione stava bloccando lo schema che avrebbe giustificato il blocco.

Lo spostamento di tutte le dichiarazioni variabili all'inizio della procedura memorizzata riduce i ricompilamenti?

Risposte:


18

No.

Questo o era vero molto tempo fa (e non lo è più, almeno da SQL Server 2000), oppure non è mai stato vero e il tuo DBA ha semplicemente confuso la sua raccomandazione con la seguente :

È importante raggruppare tutte le istruzioni DDL (come la creazione di indici) per le tabelle temporanee all'inizio di una procedura memorizzata. Mettendo insieme queste istruzioni DDL è possibile evitare compilazioni non necessarie dovute alla modifica dello schema.

Puoi trovare un'altra spiegazione del ragionamento alla base di questa raccomandazione in questa pagina .

Se diamo un'occhiata a questo Microsoft KB , vediamo che la causa di una ricompilazione della procedura memorizzata può essere una delle seguenti (SQL Server 2005+):

  1. Lo schema è cambiato.
  2. Le statistiche sono cambiate.
  3. Ricompila DNR.
  4. Opzione impostata modificata.
  5. Tabella temporanea modificata.
  6. Il set di righe remoto è stato modificato.
  7. Per permanenti di ricerca cambiati.
  8. L'ambiente di notifica delle query è cambiato.
  9. Vista MPI modificata.
  10. Opzioni del cursore modificate.
  11. Con opzione ricompilare.

Dichiarare una variabile - anche una variabile di tabella (cioè @table_variable) - non può innescare nessuno di questi eventi, ovviamente, perché dichiarare una variabile non conta come DDL . Una variabile (anche una variabile di tabella) è un oggetto temporaneo utilizzato esclusivamente per la programmazione T-SQL. Ecco perché le variabili di tabella non ottengono statistiche e non sono vincolate da transazioni . La dichiarazione di una variabile (tabella o no) non può innescare una ricompilazione proc.

La creazione di una tabella temporanea (ovvero #temp_table) o di un indice, tuttavia, è DDL che influisce sulla definizione fisica del database. Le tabelle e gli indici temporanei sono oggetti "reali" con statistiche e controllo transazionale, pertanto la loro creazione potrebbe generare uno qualsiasi degli eventi 1, 2 o 5 nell'elenco precedente e quindi attivare una ricompilazione proc.


3

Non dovrebbe fare la differenza o ridurre i blocchi di compilazione o causare meno ricompilazioni per dichiarare una variabile a metà dello stack o in alto. Mi capita di farlo in cima per leggibilità il più delle volte.

Per arrivare alla parte "cosa sta pensando il mio DBA" della domanda, l'unica cosa che mi viene in mente (a parte il fatto che Nick sta pensando a come era qualcosa) è forse stavano parlando di Parameter Sniffing (Vedi Opzione 2 a questo link su semplici discorsi)

Informazioni sul tuo blocco -> Se stai vedendo un vero blocco, questo non è il tipo di contesa di blocco della compilazione di cui il tuo DBA sta parlando molto probabilmente. Sebbene sia vero che ci sono alcune cose che influiscono su questo (non le tabelle di qualificazione dello schema, non lo schema che qualifica le chiamate della procedura memorizzata, ad esempio), questa non è certamente la causa delle letture elevate e probabilmente non la causa del blocco. Dovresti assolutamente fare tutto il possibile per evitare questi blocchi di compilazione. Ma guarderei all'ottimizzazione e all'ottimizzazione del resto del codice della procedura memorizzata come un'attività più importante che preoccuparsi della posizione delle variabili. Puoi anche leggere Come identificare e risolvere i blocchi di compilazione se vuoi verificare di non avere problemi qui.

Pubblica gli esempi prima / dopo e vedremo cosa sta guidando il DBA qui.

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.