Esecuzione preparata
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)
L'API ODBC definisce l'esecuzione preparata come modo per ridurre il sovraccarico di analisi e compilazione associato all'esecuzione ripetuta di un'istruzione Transact-SQL. L'applicazione compila una stringa di caratteri contenente un'istruzione SQL e quindi la esegue in due fasi. Chiama la funzione SQLPrepare una volta per avere l'istruzione analizzata e compilata in un piano di esecuzione dal motore di database. Chiama quindi SQLExecute per ogni esecuzione del piano di esecuzione preparato. con conseguente risparmio dell'overhead correlato all'analisi e alla compilazione in ogni esecuzione. L'esecuzione preparata viene generalmente utilizzata dalle applicazioni per eseguire ripetutamente la stessa istruzione SQL con parametri.
Per la maggior parte dei database, l'esecuzione preparata è più veloce dell'esecuzione diretta per le istruzioni eseguite più di tre o quattro volte, sopratutto perché l'istruzione viene compilata una sola volta, mentre le istruzioni eseguite direttamente vengono compilate ogni volta che vengono eseguite. L'esecuzione preparata può inoltre offrire una riduzione del traffico di rete perché il driver può inviare all'origine dati un identificatore del piano di esecuzione e i valori dei parametri, anziché un'intera istruzione SQL, ogni volta che viene eseguita l'istruzione.
SQL Server riduce la differenza di prestazioni tra l'esecuzione diretta e preparata tramite algoritmi migliorati per rilevare e riutilizzare i piani di esecuzione da SQLExecDirect. offrendo alle istruzioni eseguite direttamente alcuni dei vantaggi di prestazioni associati all'esecuzione preparata. Per altre informazioni, vedere Esecuzione diretta.
SQL Server offre anche supporto nativo per l'esecuzione preparata. Un piano di esecuzione è basato su SQLPrepare e successivamente eseguito quando viene chiamato SQLExecute . Poiché SQL Server non è necessario per compilare stored procedure temporanee in SQLPrepare, non è previsto alcun sovraccarico aggiuntivo nelle tabelle di sistema in tempdb.
Per motivi di prestazioni, la preparazione dell'istruzione viene posticipata fino alla chiamata di SQLExecute o a un'operazione di metaproprietà, ad esempio SQLDescribeCol o SQLDescribeParam in ODBC. Questo è il comportamento predefinito. Eventuali errori nell'istruzione da preparare saranno noti solo dopo l'esecuzione dell'istruzione o dell'operazione di metaproprietà. L'impostazione dell'attributo di istruzione specifica del driver ODBC di SQL Server Native Client SQL_SOPT_SS_DEFER_PREPARE su SQL_DP_OFF può disattivare questo comportamento predefinito.
In caso di preparazione posticipata, chiamare SQLDescribeCol o SQLDescribeParam prima di chiamare SQLExecute genera un round trip aggiuntivo al server. In SQLDescribeCol il driver rimuove la clausola WHERE dalla query e la invia al server con SET FMTONLY ON per ottenere la descrizione delle colonne nel primo set di risultati restituito dalla query. In SQLDescribeParam, il driver chiama il server per ottenere una descrizione delle espressioni o delle colonne a cui fa riferimento qualsiasi marcatore di parametro nella query. Questo metodo presenta inoltre alcune restrizioni, ad esempio non è in grado di risolvere i parametri nelle sottoquery.
L'utilizzo eccessivo di SQLPrepare con il driver ODBC di SQL Server Native Client peggiora le prestazioni, soprattutto quando si è connessi alle versioni precedenti di SQL Server. L'esecuzione preparata non dev’essere utilizzata per le istruzioni eseguite una sola volta. L'esecuzione preparata è più lenta dell'esecuzione diretta per una singola esecuzione di un'istruzione perché richiede un round trip in rete aggiuntivo dal client al server. Nelle versioni precedenti di SQL Server genera anche una stored procedure temporanea.
Le istruzioni preparate non possono essere usate per creare oggetti temporanei in SQL Server.
Alcune applicazioni ODBC iniziali usano SQLPrepare in qualsiasi momento in cui è stato usato SQLBindParameter . SQLBindParameter non richiede l'uso di SQLPrepare, ma può essere usato con SQLExecDirect. Ad esempio, usare SQLExecDirect con SQLBindParameter per recuperare il codice restituito o i parametri di output da una stored procedure eseguita una sola volta. Non usare SQLPrepare con SQLBindParameter , a meno che la stessa istruzione non venga eseguita più volte.