Come SQL Server fa corrispondere le guide di piano alle query

SQL Server fa corrispondere le guide di piano di tipo OBJECT alle query presenti nella stored procedure, nel trigger o nella funzione (modulo) definita nell'argomento @module_or_batch della stored procedure sp_create_plan_guide. Se nel modulo esiste una guida di piano, viene fatta corrispondere alla query specificata.

Per le query inoltrate all'interno di batch, SQL Server fa corrispondere le guide di piano tentando innanzitutto di far corrispondere la query a una guida di piano basata su SQL, successivamente tentando di parametrizzare la query e poi tentando di nuovo. Nella figura seguente viene illustrata una panoramica di questo processo.

Definizione delle corrispondenze tra guide di piano e query in SQL Server

  1. Query Optimizer di SQL Server riconosce un batch eseguito come richiesta di compilare ogni istruzione all'interno del batch.

  2. Per una specifica istruzione all'interno del batch, SQL Server tenta di far corrispondere l'istruzione a una guida di piano basata su SQL il cui argomento @module_or_batch corrisponde a quello del testo del batch in ingresso, incluso qualsiasi valore letterale costante, e il cui argomento @stmt corrisponde all'istruzione nel batch. Se questo tipo di guida di piano esiste e dunque esiste la corrispondenza, il testo dell'istruzione viene modificato per includere gli hint per la query specificati nella guida di piano. L'istruzione viene quindi compilata di conseguenza.

  3. Se al passaggio 2 non viene individuata una guida di piano corrispondente all'istruzione, SQL Server sottopone l'istruzione a parametrizzazione forzata. In questo passaggio la parametrizzazione può avere esito negativo nei casi seguenti:

    1. L'istruzione è già con parametri o contiene variabili locali.

    2. È impostata l'opzione SET di database PARAMETERIZATION SIMPLE (impostazione predefinita) e non esiste una guida di piano di tipo TEMPLATE che si applica all'istruzione e specifica l'hint per la query PARAMETERIZATION FORCED.

    3. Esiste una guida di piano di tipo TEMPLATE che si applica all'istruzione e specifica l'hint di query PARAMETERIZATION SIMPLE.

    Se la parametrizzazione forzata ha esito positivo, SQL Server tenta di far corrispondere la forma con parametri dell'istruzione a una guida di piano di tipo SQL creata sull'istruzione con parametri. Se questo tipo di guida di piano esiste e dunque esiste la corrispondenza, il testo dell'istruzione viene modificato per includere gli hint per la query specificati nella guida di piano. L'istruzione viene quindi compilata di conseguenza. Se la guida di piano corrispondente non viene individuata, l'istruzione con parametri viene compilata senza essere modificata da una guida di piano.

  4. Se al passaggio 3 la parametrizzazione ha esito negativo, SQL Server tenta di nuovo di parametrizzare l'istruzione. Questa volta, SQL Server applica la parametrizzazione semplice. La query risultante viene quindi compilata direttamente. Le guide di piano non vengono fatte corrispondere ai risultati della parametrizzazione semplice.

    [!NOTA]

    L'hint per la query RECOMPILE viene ignorato nelle guide di piano di tipo SQL applicate alle query sottoposte a parametrizzazione semplice o forzata. Viene inoltre generato un messaggio di avviso.