Erstellen einer neuen PlanhinweislisteCreate a New Plan Guide

Gilt für: JaSQL Server JaAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Planhinweislisten beeinflussen die Abfrageoptimierung, indem Abfragehinweise oder ein fester Abfrageplan an die Abfragen angefügt werden.Plan guides influence query optimization by attaching query hints or a fixed query plan to them. In der Planhinweisliste geben Sie die Anweisung an, die optimiert werden soll, sowie entweder eine OPTION-Klausel mit den zu verwendenden AbfragehinweisenIn the plan guide, you specify the statement that you want optimized, and either an OPTION clause that contains query hints you want to use. oder einen spezifischen Abfrageplan, der für die Optimierung der Abfrage verwendet werden soll.or a specific query plan you want to use to optimize the query. Wenn die Abfrage ausgeführt wird, vergleicht der Abfrageoptimierer die Transact-SQLTransact-SQL -Anweisung mit der Planhinweisliste und fügt der Abfrage entweder zur Laufzeit die OPTION-Klausel hinzu oder verwendet den angegebenen Abfrageplan.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.

Eine Planhinweisliste wendet entweder einen festen Abfrageplan und/oder Abfragehinweise auf eine Abfrage an.A Plan Guide applies either a fixed query plan, and/or query hints, to a query.

EinschränkungenLimitations and restrictions

  • Die Argumente für sp_create_plan_guide müssen in der angezeigten Reihenfolge bereitgestellt werden.The arguments to sp_create_plan_guide must be provided in the order that is shown. Wenn Sie Werte für die Parameter von sp_create_plan_guideangeben, müssen entweder alle oder überhaupt keine Parameternamen explizit angegeben werden.When you supply values for the parameters of sp_create_plan_guide, all parameter names must be specified explicitly, or none at all. Wird z.B. @name = angegeben, müssen auch @stmt = , @type = usw. angegeben werden.For example, if @name = is specified, then @stmt = , @type =, and so on, must also be specified. Ebenso dürfen, wenn @name = nicht angegeben und nur der Parameterwert bereitgestellt wird, die übrigen Parameterwerte ebenfalls nicht angegeben und nur ihre Werte bereitgestellt werden.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. Argumentnamen dienen nur zu Beschreibungszwecken, zum besseren Verständnis der Syntax.Argument names are for descriptive purposes only, to help understand the syntax. SQL ServerSQL Server überprüft nicht, ob der angegebene Parametername mit dem Namen des Parameters an der Position übereinstimmt, an der der Name verwendet wird.does not verify that the specified parameter name matches the name for the parameter in the position where the name is used.

  • Sie können mehr als eine Planhinweisliste des Typs OBJECT oder SQL für dieselbe Abfrage und den Batch oder das Modul erstellen.You can create more than one OBJECT or SQL plan guide for the same query and batch or module. Es kann jedoch nur jeweils eine Planhinweisliste aktiviert sein.However, only one plan guide can be enabled at any given time.

  • Planhinweislisten vom Typ OBJECT können nicht für einen @module_or_batch-Wert erstellt werden, der auf eine gespeicherte Prozedur, Funktion oder einen DML-Trigger verweist, in der bzw. dem die WITH ENCRYPTION-Klausel angegeben wird oder die bzw. der temporär ist.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.

  • Das Löschen oder Ändern einer Funktion, einer gespeicherten Prozedur oder eines DML-Triggers, auf die bzw. den in einer Planhinweisliste verwiesen wird, verursacht einen Fehler.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. Auch der Versuch, eine Tabelle mit einem Trigger zu löschen, auf den eine Planhinweisliste verweist, führt zu einem Fehler.Trying to drop a table that has a trigger defined on it that is referenced by a plan guide also causes an error.

BerechtigungenPermissions

Um eine Planhinweisliste vom Typ OBJECT zu erstellen, benötigen Sie ALTER-Berechtigung für das Objekt, auf das verwiesen wird.To create a plan guide of type OBJECT, you need ALTER permission on the referenced object. Um eine Planhinweisliste vom Typ SQL oder TEMPLATE zu erstellen, benötigen Sie ALTER-Berechtigung für die aktuelle Datenbank.To create a plan guide of type SQL or TEMPLATE, you need ALTER permission on the current database.

Erstellen einer Planhinweisliste mit SSMSCreate a plan guide using SSMS

  1. Klicken Sie auf das Pluszeichen, um die Datenbank zu erweitern, in der Sie eine Planhinweisliste erstellen möchten, und klicken Sie dann auf das Pluszeichen, um den Ordner Programmierbarkeit zu erweitern.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. Klicken Sie mit der rechten Maustaste auf den Ordner Planhinweislisten, und wählen Sie Neue Planhinweisliste aus. select_plan_guideRight-click the Plan Guides folder and select New Plan Guide.... select_plan_guide

  3. Geben Sie im Dialogfeld Neue Planhinweisliste im Feld Name den Namen der Planhinweisliste ein.In the New Plan Guide dialog box, in the Name box, enter the name of the plan guide.

  4. Geben Sie im Feld Anweisung die Transact-SQLTransact-SQL -Anweisung ein, auf die die Planhinweisliste angewendet werden soll.In the Statement box, enter the Transact-SQLTransact-SQL statement against which the plan guide is to be applied.

  5. Wählen Sie in der Liste Bereichstyp den Entitätstyp aus, mit dem die Transact-SQLTransact-SQL -Anweisung angezeigt wird.In the Scope type list, select the type of entity in which the Transact-SQLTransact-SQL statement appears. Dies gibt den Kontext zum Abgleich der Transact-SQLTransact-SQL -Anweisung mit der Planhinweisliste an.This specifies the context for matching the Transact-SQLTransact-SQL statement to the plan guide. Mögliche Werte sind OBJECT, SQLund TEMPLATE.Possible values are OBJECT, SQL, and TEMPLATE.

  6. Geben Sie im Feld Bereichsbatch den Batchtext ein, mit dem die Transact-SQLTransact-SQL -Anweisung angezeigt wird.In the Scope batch box, enter the batch text in which the Transact-SQLTransact-SQL statement appears. Der Batchtext darf keine USEDatenbank-Anweisung enthalten.The batch text cannot include a USEdatabase statement. Das Feld Bereichsbatch ist nur verfügbar, wenn SQL als Bereichstyp ausgewählt ist.The Scope batch box is only available when SQL is selected as a scope type. Wenn bei Verwendung von SQL als Bereichstyp im Feld Bereichsbatch kein Wert angegeben wird, wird der Wert des Batchtexts auf den gleichen Wert wie im Feld Anweisung festgelegt.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. Geben Sie in der Liste Name von Bereichsschema den Namen des Schemas ein, in dem sich das Objekt befindet.In the Scope schema name list, enter the name of the schema in which the object is contained. Das Feld Name von Bereichsschema ist nur verfügbar, wenn Objekt als Bereichstyp ausgewählt ist.The Scope schema name box is only available when Object is selected as a scope type.

  8. Geben Sie im Feld Name von Bereichsobjekt den Namen der gespeicherten Transact-SQLTransact-SQL -Prozedur, der benutzerdefinierten Skalarfunktion, der aus mehreren Anweisungen bestehenden Tabellenwertfunktion oder des DML-Triggers ein, worin die Transact-SQLTransact-SQL -Anweisung enthalten ist.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. Das Feld Name von Bereichsobjekt ist nur verfügbar, wenn Objekt als Bereichstyp ausgewählt ist.The Scope object name box is only available when Object is selected as a scope type.

  9. Geben Sie im Feld Parameter den Parameternamen und Datentyp aller Parameter ein, die in die Transact-SQLTransact-SQL -Anweisung eingebettet sind.In the Parameters box, enter the parameter name and data type of all parameters that are embedded in the Transact-SQLTransact-SQL statement.

    Parameter sind nur dann anwendbar, wenn eine der folgenden Aussagen zutrifft:Parameters apply only when either of the following is true:

    • Der Bereichstyp lautet SQL oder TEMPLATE.The scope type is SQL or TEMPLATE. Bei TEMPLATEdürfen Parameter nicht NULL sein.If TEMPLATE, parameters must not be NULL.

    • Die Transact-SQLTransact-SQL -Anweisung wird mithilfe von sp_executesql übermittelt und für den Parameter ein Wert festgelegt, oder SQL ServerSQL Server übermittelt eine Anweisung intern, nachdem sie parametrisiert wurde.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. Geben Sie im Feld Hinweise die Abfragehinweise oder den Abfrageplan ein, die bzw. der auf die Transact-SQLTransact-SQL -Anweisung angewendet werden soll.In the Hints box, enter the query hints or query plan to be applied to the Transact-SQLTransact-SQL statement. Geben Sie eine gültige OPTION-Klausel ein, um einen oder mehrere Abfragehinweise festzulegen.To specify one or more query hints, enter a valid OPTION clause.

  11. Klicken Sie auf OK.Click OK.

plan_guide

Erstellen einer Planhinweisliste mit T-SQLCreate a plan guide using T-SQL

  1. Stellen Sie im Objekt-Explorer eine Verbindung mit einer Datenbank-EngineDatabase Engine-Instanz her.In Object Explorer, connect to an instance of Datenbank-EngineDatabase Engine.

  2. Klicken Sie in der Standardleiste auf Neue Abfrage.On the Standard bar, click New Query.

  3. Kopieren Sie das folgende Beispiel, fügen Sie es in das Abfragefenster ein, und klicken Sie auf Ausführen.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)';  
    
    

Weitere Informationen finden Sie unter sp_create_plan_guide (Transact-SQL).For more information, see sp_create_plan_guide (Transact-SQL).