Condividi tramite


Preparazione delle istruzioni SQL

Il motore relazionale di SQL Server offre supporto completo per la preparazione di istruzioni SQL prima della relativa esecuzione. Se in un'applicazione è necessario eseguire più volte un'istruzione SQL, è possibile utilizzare l'API di database per:

  • Preparare l'istruzione una sola volta. L'istruzione SQL viene compilata in un piano di esecuzione.

  • Eseguire il piano di esecuzione precompilato ogni volta che è necessario eseguire l'istruzione. In questo modo, si evita di ricompilare l'istruzione SQL a ogni esecuzione dopo la prima volta.

    La preparazione e l'esecuzione delle istruzioni è controllata dalle funzioni e dai metodi dell'API. Tali elementi non fanno parte del linguaggio Transact-SQL. Il modello di preparazione/esecuzione per l'esecuzione di istruzioni SQL è supportato dal Provider OLE DB Native Client di e SQL Server e dal driver ODBC Native Client di SQL Server. Alla richiesta di preparazione, il provider o il driver invia l'istruzione a SQL Server con la richiesta di preparare l'istruzione. SQL Server compila un piano di esecuzione e restituisce un handle del piano al provider o al driver. Alla richiesta di esecuzione, il provider o il driver invia al server una richiesta di esecuzione del piano associato all'handle.

Le istruzioni preparate non possono essere utilizzate per creare oggetti temporanei in SQL Server. Nelle istruzioni preparate, infatti, non è consentito fare riferimento a stored procedure di sistema che creano oggetti temporanei, ad esempio tabelle temporanee. Tali procedure devono essere eseguite in modo diretto.

L'utilizzo eccessivo del modello di preparazione/esecuzione può determinare un peggioramento delle prestazioni. Se un'istruzione viene eseguita una sola volta, è sufficiente l'esecuzione diretta, che richiede un solo ciclo di andata e ritorno in rete per il server. La preparazione e l'esecuzione di un'istruzione SQL che viene eseguita una sola volta richiedono un ciclo di andata e ritorno in rete aggiuntivo (uno per preparare l'istruzione e uno per eseguirla).

È possibile preparare un'istruzione in modo più efficiente utilizzando gli indicatori di parametro. Si supponga, ad esempio, che a un'applicazione venga richiesto occasionalmente di recuperare informazioni sui prodotti dal database di esempio AdventureWorks. L'applicazione può eseguire questa operazione in due modi diversi.

L'applicazione può innanzitutto eseguire una query distinta per ogni prodotto richiesto:

SELECT * FROM AdventureWorks.Production.Product
WHERE ProductID = 63;

Altrimenti, l'applicazione può eseguire le operazioni seguenti:

  1. Preparare un'istruzione contenente un indicatore di parametro (?):

    SELECT * FROM AdventureWorks.Production.Product
    WHERE ProductID = ?;
    
  2. Associare una variabile di programma all'indicatore di parametro.

  3. A ogni richiesta di informazioni sul prodotto, inserire nella variabile associata il valore di chiave ed eseguire l'istruzione.

Il secondo metodo è più efficiente se l'istruzione viene eseguita più di tre volte.

In SQL Server il modello di preparazione/esecuzione non offre alcun vantaggio significativo in termini di prestazioni rispetto all'esecuzione diretta, a causa delle modalità di riutilizzo dei piani di esecuzione da parte di SQL Server. In SQL Server sono disponibili algoritmi efficaci che consentono di trovare una corrispondenza tra le istruzioni SQL correnti e i piani di esecuzione generati per esecuzioni precedenti della stessa istruzione SQL. Se un'applicazione esegue più volte un'istruzione SQL con indicatori di parametro, SQL Server riutilizzerà il piano di esecuzione della prima esecuzione per la seconda e le successive esecuzioni, a meno che il piano non sia stato rimosso dalla cache delle procedure. Il modello di preparazione/esecuzione presenta comunque i vantaggi seguenti:

  • È più conveniente cercare un piano di esecuzione tramite un handle di identificazione che non utilizzare gli algoritmi per trovare una corrispondenza tra un'istruzione SQL e i piani di esecuzione esistenti.

  • L'applicazione può controllare il momento della creazione del piano di esecuzione e del suo riutilizzo.

  • Il modello di preparazione/esecuzione è utilizzabile con altri database, incluse le versioni precedenti di SQL Server.