Creare una nuova guida di pianoCreate a New Plan Guide

Le guide di piano influiscono sull'ottimizzazione delle query mediante l'aggiunta di hint o di un piano di query fisso.Plan guides influence query optimization by attaching query hints or a fixed query plan to them. Nella guida di piano è necessario specificare l'istruzione che si vuole ottimizzare e una clausola OPTION che contiene gli hint per la query da usare.In the plan guide, you specify the statement that you want optimized, and either an OPTION clause that contains query hints you want to use. In alternativa, un piano di query specifico che si vuole usare per ottimizzare la query.or a specific query plan you want to use to optimize the query. Quando viene eseguita la query, in Query Optimizer è possibile far corrispondere l'istruzione Transact-SQLTransact-SQL alla guida di piano e associare la clausola OPTION alla query in fase di esecuzione oppure utilizzare il piano di query specificato.When the query executes, the query optimizer matches the Transact-SQLTransact-SQL statement to the plan guide and either attaches the OPTION clause to the query at run time or uses the specified query plan.

Una guida di piano applica a una query un piano di query fisso e/o hint per la query.A Plan Guide applies either a fixed query plan, and/or query hints, to a query.

Limitazioni e restrizioni Limitations and restrictions

  • Gli argomenti per sp_create_plan_guide devono essere inseriti nell'ordine illustrato.The arguments to sp_create_plan_guide must be provided in the order that is shown. Quando si forniscono valori per i parametri di sp_create_plan_guide, è necessario specificare in modo esplicito tutti i nomi dei parametri oppure nessuno.When you supply values for the parameters of sp_create_plan_guide, all parameter names must be specified explicitly, or none at all. Se ad esempio si specifica @name =, è necessario specificare anche @stmt = , @type = e così via.For example, if @name = is specified, then @stmt = , @type =, and so on, must also be specified. Analogamente, se si omette @name = e viene specificato soltanto il valore del parametro, è necessario omettere anche i nomi dei parametri restanti e specificarne solo il valore.Likewise, if @name = is omitted and only the parameter value is provided, the remaining parameter names must also be omitted, and only their values provided. I nomi degli argomenti hanno scopo esclusivamente descrittivo, per facilitare la comprensione della sintassi.Argument names are for descriptive purposes only, to help understand the syntax. SQL ServerSQL Server non verifica che il nome di parametro specificato corrisponda al nome del parametro nella posizione in cui il nome viene utilizzato. does not verify that the specified parameter name matches the name for the parameter in the position where the name is used.

  • È possibile creare più guide di piano OBJECT o SQL per la stessa query e batch o modulo.You can create more than one OBJECT or SQL plan guide for the same query and batch or module. Tuttavia è possibile abilitare una sola guida di piano alla volta.However, only one plan guide can be enabled at any given time.

  • Non è possibile creare guide di piano di tipo OBJECT per un valore @module_or_batch che fa riferimento a una stored procedure, una funzione o un trigger DML che specifica la clausola WITH ENCRYPTION o che è temporaneo.Plan guides of type OBJECT cannot be created for an @module_or_batch value that references a stored procedure, function, or DML trigger that specifies the WITH ENCRYPTION clause or that is temporary.

  • Se si tenta di eliminare o modificare una funzione, una stored procedure o un trigger DML a cui viene fatto riferimento in una guida di piano abilitata o disabilitata, viene generato un errore.Trying to drop or modify a function, stored procedure, or DML trigger that is referenced by a plan guide, either enabled or disabled, causes an error. Viene generato un errore anche se si cerca di eliminare una tabella per la quale è stato definito un trigger a cui una guida di piano fa riferimento.Trying to drop a table that has a trigger defined on it that is referenced by a plan guide also causes an error.

Permissions Permissions

Per creare una guida di piano di tipo OBJECT, è necessaria l'autorizzazione ALTER per l'oggetto a cui si fa riferimento.To create a plan guide of type OBJECT, you need ALTER permission on the referenced object. Per creare una guida di piano di tipo SQL o TEMPLATE, è necessaria l'autorizzazione ALTER per il database corrente.To create a plan guide of type SQL or TEMPLATE, you need ALTER permission on the current database.

Per creare una guida di piano usando SSMS Create a plan guide using SSMS

  1. Fare clic sul segno più per espandere il database in cui si desidera creare una guida di piano, quindi fare clic sul segno più per espandere la cartella Programmabilità .Click the plus sign to expand the database in which you want to create a plan guide, and then click the plus sign to expand the Programmability folder.

  2. Fare clic con il pulsante destro del mouse sulla cartella Guide di piano e selezionare Nuova guida di piano….Right-click the Plan Guides folder and select New Plan Guide…. select_plan_guideselect_plan_guide

  3. Nella casella Nome della finestra di dialogo Nuova guida di piano immettere il nome della guida di piano.In the New Plan Guide dialog box, in the Name box, enter the name of the plan guide.

  4. Nella casella Istruzione immettere l'istruzione Transact-SQLTransact-SQL sulla quale deve essere applicata la guida di piano.In the Statement box, enter the Transact-SQLTransact-SQL statement against which the plan guide is to be applied.

  5. Nell'elenco Tipo di ambito selezionare il tipo di entità in cui l'istruzione Transact-SQLTransact-SQL viene visualizzata.In the Scope type list, select the type of entity in which the Transact-SQLTransact-SQL statement appears. Viene specificato il contesto per adeguare l'istruzione Transact-SQLTransact-SQL alla guida di piano.This specifies the context for matching the Transact-SQLTransact-SQL statement to the plan guide. I valori possibili sono OBJECT, SQLe TEMPLATE.Possible values are OBJECT, SQL, and TEMPLATE.

  6. Nella casella Batch ambito immettere il testo del batch in cui l'istruzione Transact-SQLTransact-SQL viene visualizzata.In the Scope batch box, enter the batch text in which the Transact-SQLTransact-SQL statement appears. Nel testo del batch non può essere inclusa un'istruzione USE*database* .</span><span class="sxs-lookup"><span data-stu-id="ea03c-133">The batch text cannot include a USEdatabase statement. La casella Batch ambito è disponibile solo quando come tipo di ambito è selezionato SQL .The Scope batch box is only available when SQL is selected as a scope type. Se non è stato immesso alcun dato nella casella relativa al batch ambito quando SQL è il tipo di ambito, il valore del testo del batch viene impostato sullo stesso valore inserito nella casella Istruzione .If nothing is entered in the scope batch box when SQL is the scope type, then the value of the batch text is set to the same value as is in the Statement box.

  7. Nell'elenco Nome schema ambito immettere il nome dello schema in cui è contenuto l'oggetto.In the Scope schema name list, enter the name of the schema in which the object is contained. La casella Nome schema ambito è disponibile solo quando come tipo di ambito è selezionato Oggetto .The Scope schema name box is only available when Object is selected as a scope type.

  8. Nella casella Nome oggetto ambito immettere il nome della stored procedure Transact-SQLTransact-SQL , della funzione scalare definita dall'utente, della funzione con valori di tabella con istruzioni multiple o del trigger DML in cui viene visualizzata l'istruzione Transact-SQLTransact-SQL .In the Scope object name box, enter the name of the Transact-SQLTransact-SQL stored procedure, user-defined scalar function, multistatement table-valued function, or DML trigger in which the Transact-SQLTransact-SQL statement appears. La casella Nome oggetto ambito è disponibile solo quando come tipo di ambito è selezionato Oggetto .The Scope object name box is only available when Object is selected as a scope type.

  9. Nella casella Parametri immettere il nome e il tipo di dati di tutti i parametri incorporati nell'istruzione Transact-SQLTransact-SQL .In the Parameters box, enter the parameter name and data type of all parameters that are embedded in the Transact-SQLTransact-SQL statement.

    I parametri vengono applicati solo nei casi seguenti:Parameters apply only when either of the following is true:

    • Il tipo di ambito è SQL o TEMPLATE.The scope type is SQL or TEMPLATE. Se TEMPLATE, i parametri non devono essere NULL.If TEMPLATE, parameters must not be NULL.

    • L'istruzione Transact-SQLTransact-SQL viene sottomessa tramite sp_executesql e non viene specificato un valore per il parametro @params oppure SQL ServerSQL Server sottomette internamente un'istruzione dopo averla parametrizzata.The Transact-SQLTransact-SQL statement is submitted by using sp_executesql and a value for the parameter is specified, or SQL ServerSQL Server internally submits a statement after parameterizing it.

  10. Nella casella Hint immettere gli hint per la query o il piano di query da applicare all'istruzione Transact-SQLTransact-SQL .In the Hints box, enter the query hints or query plan to be applied to the Transact-SQLTransact-SQL statement. Per specificare uno o più hint per la query, immettere una clausola OPTION valida.To specify one or more query hints, enter a valid OPTION clause.

  11. Scegliere OK.Click OK.

plan_guide

Per creare una guida di piano usando T-SQL Creat a plan guide using T-SQL

  1. In Esplora oggetticonnettersi a un'istanza del Motore di databaseDatabase Engine.In Object Explorer, connect to an instance of Motore di databaseDatabase Engine.

  2. Sulla barra Standard fare clic su Nuova query.On the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and click Execute.

    -- creates a plan guide named Guide1 based on a SQL statement  
    EXEC sp_create_plan_guide   
        @name = N'Guide1',   
        @stmt = N'SELECT TOP 1 *   
                  FROM Sales.SalesOrderHeader   
                  ORDER BY OrderDate DESC',   
        @type = N'SQL',  
        @module_or_batch = NULL,   
        @params = NULL,   
        @hints = N'OPTION (MAXDOP 1)';  
    

    Per altre informazioni, vedere sp_create_plan_guide (Transact-SQL).For more information, see sp_create_plan_guide (Transact-SQL).