Esecuzione preparata

Si applica a: SQL Server Azure SQL DatabaseIstanza gestita di SQL di Azure Azure SynapseAnalytics AnalyticsPlatform System (PDW)

L'API ODBC definisce l'esecuzione preparata come modo per ridurre l'analisi e la compilazione del sovraccarico associato ripetutamente all'esecuzione di un'istruzione Transact-SQL. Nell'applicazione viene compilata una stringa di caratteri contenente un'istruzione SQL che viene eseguita 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 viene eseguito in un secondo momento quando viene chiamato SQLExecute . Poiché SQL Server non è necessario creare 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 finché SQLExecute non viene chiamata o viene eseguita un'operazione metaproperty, 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 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 giro di ritorno aggiuntivo nel 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 SQL Server Native Client degrada le prestazioni, soprattutto quando si è connessi alle versioni precedenti di SQL Server. L'esecuzione preparata non deve 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 hanno usato SQLPrepare in qualsiasi momento in cui è stato usato SQLBindParameter . SQLBindParameter non richiede l'uso di SQLPrepare, 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 non venga eseguita più volte la stessa istruzione.

Vedere anche

Esecuzione di istruzioni (ODBC)