Condividi tramite


Preparazione dei comandi

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 generale, un comando deve essere preparato se verrà eseguito più di tre volte.

Per motivi di prestazioni, la preparazione del comando viene posticipata fino all'esecuzione del comando. Si tratta del comportamento predefinito. Eventuali errori nel comando preparato non sono noti fino a quando non viene eseguito il comando o viene eseguita un'operazione di metaproprietà. L'impostazione della proprietà di SQL Server SSPROP_DEFERPREPARE su FALSE può disattivare questo comportamento predefinito.

In SQL Server, quando un comando viene eseguito direttamente (senza prepararlo prima), viene creato e memorizzato nella cache un piano di esecuzione. Se l'istruzione SQL viene eseguita di nuovo, SQL Server dispone di un algoritmo efficiente in modo che corrisponda alla nuova istruzione con il piano di esecuzione esistente nella cache e riutilizza il piano di esecuzione per tale istruzione.

Per i comandi preparati, SQL Server offre supporto nativo per la preparazione e l'esecuzione di istruzioni di comando. Quando si prepara un'istruzione, SQL Server crea un piano di esecuzione, lo memorizza nella cache e restituisce un handle a questo piano di esecuzione al provider. Il provider usa quindi questo 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 che eseguirla direttamente, se si conosce che l'istruzione verrà eseguita più volte.

In SQL Server 2005 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 mai essere preparati. Ad esempio, i comandi che specificano l'esecuzione della stored procedure o includono testo non valido per la creazione di stored procedure di SQL Server non devono essere preparati.

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 -specific proprietà di inizializzazione 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 ha esito positivo se l'utente dell'applicazione dispone di autorizzazioni di SQL Server sufficienti.

Per i consumer che si disconnettono raramente, la creazione di stored procedure temporanee può richiedere risorse significative di tempdb, il database di sistema di SQL Server in cui vengono creati 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 tale connessione è la connessione predefinita creata nell'inizializzazione dell'origine dati, la stored procedure temporanea viene eliminata solo quando l'origine dati non viene 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 non richiede più il testo del comando.

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

Un oggetto comando ha al massimo una stored procedure temporanea in tempdb. Qualsiasi stored procedure temporanea esistente rappresenta il testo corrente del comando di un oggetto comando specifico.

Vedere anche

Comandi