Preparazione dei comandi

Il provider OLE DB di SQL Server Native Client supporta la funzione di preparazione dei comandi per l'esecuzione multipla ottimizzata di un solo comando. La preparazione dei comandi genera tuttavia overhead e per un consumer non esiste la necessità di 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, anziché mettere in corrispondenza l'istruzione al piano di esecuzione nella cache (come nel caso dell'esecuzione diretta), è più efficiente preparare un'istruzione piuttosto che eseguirla direttamente, se è noto che l'istruzione verrà eseguita più volte.

In SQL Server 2005 le istruzioni preparate non possono essere utilizzate 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 la esegue, restituendo i risultati come se fosse stata eseguita l'istruzione stessa.

La creazione di stored procedure temporanee viene controllata dalla proprietà di inizializzazione specifica del provider OLE DB di SQL Server Native Client denominata 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 situazioni seguenti:

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

  • Il consumer utilizza ICommandPrepare::Unprepare per indicare che non richiede più il testo del comando.

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

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

Vedere anche

Concetti

Comandi