Condividi tramite


Preparazione dei comandi in SQL Server Native Client

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)

Il provider OLE DB di SQL Server Native Client supporta la preparazione dei comandi per l'esecuzione multipla ottimizzata di un singolo comando; Tuttavia, la preparazione dei comandi genera un sovraccarico e un consumer non deve preparare un comando per eseguirlo più volte. In genere, un comando deve essere preparato se verrà eseguito più di tre volte.

Per motivi relativi alle prestazioni, la preparazione dei comandi viene rinviata fino all'esecuzione del comando. Questo è il comportamento predefinito. Eventuali errori nel comando da preparare verranno rilevati solo dopo l'esecuzione del comando o dell'operazione di metaproprietà. L'impostazione della proprietà di SQL Server SSPROP_DEFERPREPARE su FALSE può determinare la disattivazione del comportamento predefinito.

In SQL Server, quando un comando viene eseguito direttamente (senza preparazione iniziale), viene creato un piano di esecuzione che viene memorizzato nella cache. Se l'istruzione SQL viene eseguita nuovamente, in SQL Server è disponibile un algoritmo efficiente che consente di mettere in corrispondenza la nuova istruzione con il piano di esecuzione esistente nella cache e di riutilizzare il piano di esecuzione per l'istruzione in questione.

Per i comandi preparati SQL Server fornisce supporto nativo per la preparazione e l'esecuzione delle relative istruzioni. Quando si prepara un'istruzione, SQL Server consente di creare un piano di esecuzione, di memorizzarlo nella cache e di restituire al provider un handle al piano di esecuzione. Il provider quindi utilizza l'handle per eseguire ripetutamente l'istruzione. Non vengono create stored procedure. Poiché l'handle identifica direttamente il piano di esecuzione per un'istruzione SQL invece di associare l'istruzione al piano di esecuzione nella cache (come nel caso dell'esecuzione diretta), è più efficiente preparare un'istruzione rispetto a eseguirla direttamente, se si sa che l'istruzione verrà eseguita più volte.

In SQL Server 2005 (9.x) le istruzioni preparate non possono essere usate per creare oggetti temporanei e non possono fare riferimento a stored procedure di sistema che creano oggetti temporanei, ad esempio tabelle temporanee. Tali procedure devono essere eseguite in modo diretto.

Alcuni comandi non devono essere mai preparati, ad esempio quelli che specificano l'esecuzione di stored procedure o includono testo non valido per la creazione di stored procedure di SQL Server.

Se viene creata una stored procedure temporanea, il provider OLE DB di SQL Server Native Client esegue la stored procedure temporanea, restituendo risultati come se fosse stata eseguita l'istruzione stessa.

La creazione di stored procedure temporanee è controllata dal provider OLE DB di SQL Server Native Client, ovvero la proprietà di inizializzazione specifica SSPROP_INIT_USEPROCFORPREP. Se il valore della proprietà è SSPROPVAL_USEPROCFORPREP_ON o SSPROPVAL_USEPROCFORPREP_ON_DROP, il provider OLE DB di SQL Server Native Client tenta di creare una stored procedure quando viene preparato un comando. La creazione della stored procedure riesce se l'utente dell'applicazione dispone di autorizzazioni sufficienti per SQL Server.

Per i consumer che si disconnettono raramente, la creazione di stored procedure temporanee può richiedere risorse significative di tempdb, ovvero il database di sistema di SQL Server nel quale vengono creati gli oggetti temporanei. Quando il valore di SSPROP_INIT_USEPROCFORPREP è SSPROPVAL_USEPROCFORPREP_ ON, le stored procedure temporanee create dal provider OLE DB di SQL Server Native Client vengono eliminate solo quando la sessione che ha creato il comando perde la connessione all'istanza di SQL Server. Se la connessione in oggetto è quella predefinita, creata al momento dell'inizializzazione dell'origine dati, la stored procedure temporanea viene eliminata solo quando l'origine dati diventa non inizializzata.

Quando il valore di SSPROP_INIT_USEPROCFORPREP è SSPROPVAL_USEPROCFORPREP_ON_DROP, le stored procedure temporanee del provider OLE DB di SQL Server Native Client vengono eliminate quando si verifica una delle operazioni seguenti:

  • Il consumer usa ICommandText::SetCommandText per indicare un nuovo comando.

  • Il consumer usa ICommandPrepare::Unprepare per indicare che il testo del comando non è più necessario.

  • Il consumer rilascia tutti i riferimenti all'oggetto comando utilizzando la stored procedure temporanea.

Un oggetto comando include al massimo una stored procedure temporanea in tempdb. Le stored procedure temporanee esistenti rappresentano il testo del comando corrente di un oggetto comando specifico.

Vedi anche

Comandi