Condividi tramite


Informazioni sull'utilizzo forzato di piani

L'hint per query USE PLAN può essere utilizzato per imporre a Query Optimizer l'utilizzo forzato di un piano query specificato. L'hint per la query USE PLAN accetta il piano di query da utilizzare in formato XML come un argomento ed è possibile utilizzarlo per le query con piani che rallentano i tempi di esecuzione ma per le quali si è certi che esistono piani migliori. Uno scenario comune è rappresentato da query che vengono eseguite correttamente in una versione precedente di SQL Server, ma che hanno prestazioni nettamente inferiori in una versione aggiornata indipendentemente dal fatto che si tratti di un Service Pack o di un aggiornamento completo. Nella maggior parte dei casi, l'aggiornamento assicura prestazioni dello stesso livello o migliori per i tempi di esecuzione delle query, tuttavia si possono verificare eccezioni. L'hint per la query USE PLAN è in grado di gestire le situazioni in cui è consigliabile utilizzare un piano selezionato da Query Optimizer in una versione precedente del prodotto anziché un piano selezionato dopo l'aggiornamento.

È possibile utilizzare l'hint per la query USE PLAN con le guide di piano durante la risoluzione dei problemi relativi alle query con prestazioni non ottimali nelle applicazioni distribuite. Le guide di piano consentono di applicare gli hint alle query quando non è possibile o non si desidera modificare direttamente l'applicazione. Per ulteriori informazioni sulle guide di piano, vedere Ottimizzazione delle query nelle applicazioni distribuite tramite le guide di piano. Per scenari più dettagliati relativi all'applicazione dell'hint per la query USE PLAN nelle guide di piano, vedere Scenario di utilizzo forzato del piano: Creazione di una guida di piano che specifica un piano della query e Scenario di utilizzo forzato del piano: Creazione di una guida di piano per forzare l'utilizzo di un piano ottenuto da una query riformulata.

È possibile forzare l'utilizzo dei piani nella maggior parte delle query, incluse le query su tabelle, su indici cluster e non cluster, su viste indicizzate e su tabelle e indici partizionati. USE PLAN può essere specificato tramite le istruzioni del linguaggio di manipolazione dei dati (Data Manipulation Language, DML) INSERT, UPDATE, MERGE o DELETE. Notare che modificando lo schema del database, ad esempio aggiungendo o eliminando un indice, il piano specificato nell'hint USE PLAN potrebbe cessare di essere valido. Quando USE PLAN viene specificato direttamente in una query, un piano non valido fa sì che la query non riesca. Quando USE PLAN viene specificato in una guida di piano, un piano non valido farà sì che una query non riesca; tuttavia, il piano viene compilato senza utilizzare l'hint e potrebbe non essere la scelta migliore. Quando l'hint USE PLAN viene utilizzato all'interno di una guida di piano, è possibile utilizzare la funzione sys.fn_validate_plan_guide per verificare la validità del piano. In base ai risultati della funzione, è possibile decidere di eliminare la guida di piano e regolare la query oppure modificare la progettazione del database. Ad esempio, è possibile ricreare l'indice specificato nella guida di piano.

I piani query generati con l'hint per query USE PLAN vengono memorizzati nella cache come tutti gli altri piani query.

Limitazioni per l'utilizzo forzato dei piani

L'utilizzo forzato dei piani impone l'utilizzo di un singolo piano di esecuzione statico per una query. Impedisce inoltre a Query Optimizer di eseguire i necessari adattamenti per le dimensioni dei dati e le distribuzioni soggette a modifiche, i nuovi indici e le altre variabili. Se non viene applicato correttamente, l'utilizzo forzato dei piani può pertanto causare problemi di prestazioni e deve essere utilizzato solo dopo aver valutato tutte le altre opzioni disponibili per migliorare le prestazioni delle query, ad esempio l'utilizzo di statistiche aggiornate e precise e di indici ottimali. È consigliabile che venga utilizzato solo se necessario e solo da amministratori di database e sviluppatori esperti, che siano a conoscenza dei problemi correlati alle prestazioni e della mutabilità degli ambienti dei database e delle applicazioni.

Se l'hint per la query USE PLAN ha effetti sulla compilazione di una query in un'applicazione distribuita, è consigliabile specificarlo in una guida di piano anziché incorporarlo direttamente nell'applicazione. In questo modo, si ottengono i vantaggi seguenti:

  • È possibile modificare o rimuovere l'hint senza che sia necessario modificare o ricompilare l'applicazione. In alcuni casi, è possibile che l'hint USE PLAN applicabile in una versione di SQL Server non possa essere utilizzato in un Service Pack o in una versione futura. Potrebbe pertanto essere necessario modificarlo o rimuoverlo dopo che l'applicazione è stata distribuita.

  • È possibile evitare di utilizzare un hint di grandi dimensioni direttamente nella query, in modo da migliorarne la leggibilità.

    Nota importanteImportante

    Quando si crea una guida del piano che utilizza USE PLAN, è consigliabile verificare durante i test se la query corrispondente al piano che si desidera forzare viene in genere inviata con la richiesta di un cursore. I piani per le query basate su cursori sono diversi dai piani per le query non basate su cursori. Per creare una guida del piano che specifica un hint USE PLAN applicabile a una query inviata con la richiesta di un cursore è pertanto necessario specificare un piano di cursore. Per ulteriori informazioni, vedere Utilizzo dell'hint USE PLAN nelle query con cursori.

L'utilizzo forzato dei piani non è supportato per i tipi di query seguenti:

  • Query con cursori dinamici, cursori gestiti da keyset e cursori forward only. I cursori statici e fast forward-only sono supportati. Per ulteriori informazioni, vedere Utilizzo dell'hint USE PLAN nelle query con cursori.

  • Query distribuite.

  • Query full-text.