Condividi tramite


Risoluzione dei nomi posticipata e compilazione

Durante la creazione di una stored procedure viene analizzata l'accuratezza sintattica delle istruzioni incluse nella procedura. Se viene rilevato un errore sintattico nella definizione della procedura, viene restituito un errore e la stored procedure non viene creata. Se le istruzioni sono corrette dal punto di vista sintattico, il testo della stored procedure viene archiviato nella vista del catalogo sys.sql_modules.

Quando una stored procedure viene eseguita per la prima volta, Query Processor legge il testo della stored procedure dalla vista del catalogo sys.sql_modules e verifica la presenza dei nomi degli oggetti utilizzati dalla procedura. Questo processo è denominato risoluzione dei nomi posticipata perché non è necessario che gli oggetti cui fa riferimento la stored procedure esistano quando la stored procedure viene creata, ma soltanto quando viene eseguita.

[!NOTA]

La risoluzione dei nomi posticipata può essere utilizzata solo quando si fa riferimento a oggetti di tabella non esistenti. Tutti gli altri oggetti devono esistere quando si crea la stored procedure. Se, ad esempio, si fa riferimento a una tabella esistente in una stored procedure, non è possibile elencare le colonne non esistenti per tale tabella.

Nella fase di risoluzione MicrosoftSQL Server esegue inoltre altre attività di convalida, ad esempio la verifica della compatibilità del tipo di dati di una colonna con le variabili. Se gli oggetti cui fa riferimento la stored procedure non sono disponibili quando la stored procedure viene eseguita, l'esecuzione della stored procedure viene interrotta in corrispondenza del punto in cui l'istruzione fa riferimento all'oggetto mancante. Verrà quindi restituito un errore in questo caso oppure se vengono rilevati altri errori nella fase di risoluzione.

[!NOTA]

Se un oggetto cui fa riferimento la stored procedure viene eliminato o rinominato, verrà restituito un errore durante l'esecuzione della stored procedure. Se un oggetto cui fa riferimento la stored procedure viene invece sostituito con un oggetto con lo stesso nome, la stored procedure verrà eseguita senza essere ricompilata. Si supponga, ad esempio, che la stored procedure Proc1 faccia riferimento alla tabella Test1. Se la tabella Test1 viene eliminata e viene creata una tabella diversa denominata Test1, Proc1 farà riferimento alla nuova tabella. La stored procedure non dovrà essere ricreata.

Se l'esecuzione della procedura supera correttamente la fase di risoluzione, Query Optimizer in MicrosoftSQL Server analizzerà le istruzioni Transact-SQL incluse nella stored procedure e creerà un piano di esecuzione. Nel piano di esecuzione viene descritto il metodo più rapido di esecuzione della stored procedure, in base a informazioni quali:

  • La quantità di dati nelle tabelle.

  • La presenza e le caratteristiche degli indici delle tabelle e la distribuzione dei dati nelle colonne indicizzate.

  • Gli operatori e i valori di confronto utilizzati nelle condizioni della clausola WHERE.

  • La presenza di join e di parole chiave UNION, GROUP BY e ORDER BY.

Dopo aver analizzato questi fattori nella stored procedure, Query Optimizer inserirà il piano di esecuzione in memoria. Il processo di analisi della stored procedure e di creazione di un piano di esecuzione è denominato compilazione. Il piano di esecuzione in memoria ottimizzato verrà utilizzato per eseguire la query. Il piano di esecuzione rimarrà in memoria fino al riavvio di SQL Server o finché non sarà necessario spazio per l'archiviazione di un altro oggetto.

Quando la stored procedure viene rieseguita, SQL Server riutilizza il piano di esecuzione esistente se è ancora in memoria. Se il piano di esecuzione non è più presente in memoria, ne viene creato un nuovo.