Erstellen einer neuen Planhinweisliste

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Planhinweislisten beeinflussen die Abfrageoptimierung, indem Abfragehinweise oder ein fester Abfrageplan an die Abfragen angefügt werden. In der Planhinweisliste geben Sie die Anweisung an, die optimiert werden soll, sowie entweder eine OPTION-Klausel mit den zu verwendenden Abfragehinweisen oder einen spezifischen Abfrageplan, der für die Optimierung der Abfrage verwendet werden soll. Wenn die Abfrage ausgeführt wird, entspricht der Abfrageoptimierer der Transact-SQL-Anweisung der Plananleitung und fügt die OPTION-Klausel zur Laufzeit an die Abfrage an oder verwendet den angegebenen Abfrageplan.

Eine Planhinweisliste wendet entweder einen festen Abfrageplan und/oder Abfragehinweise auf eine Abfrage an.

Beschränkungen und Einschränkungen

  • Die Argumente für sp_create_plan_guide müssen in der angezeigten Reihenfolge bereitgestellt werden. Wenn Sie Werte für die Parameter von sp_create_plan_guideangeben, müssen entweder alle oder überhaupt keine Parameternamen explizit angegeben werden. Wird z. B. @name = angegeben, müssen auch @stmt = , @type =, usw. angegeben werden. 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. Argumentnamen dienen nur zu Beschreibungszwecken, zum besseren Verständnis der Syntax. SQL Server überprüft nicht, ob der angegebene Parametername dem Namen für den Parameter an der Position entspricht, an der der Name verwendet wird.

  • Sie können mehr als eine Planhinweisliste des Typs OBJECT oder SQL für dieselbe Abfrage und den Batch oder das Modul erstellen. Es kann jedoch nur jeweils eine Planhinweisliste aktiviert sein.

  • 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.

  • 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. Auch der Versuch, eine Tabelle mit einem Trigger zu löschen, auf den eine Planhinweisliste verweist, führt zu einem Fehler.

Berechtigungen

Um eine Planhinweisliste vom Typ OBJECT zu erstellen, benötigen Sie ALTER-Berechtigung für das Objekt, auf das verwiesen wird. Um eine Planhinweisliste vom Typ SQL oder TEMPLATE zu erstellen, benötigen Sie ALTER-Berechtigung für die aktuelle Datenbank.

Erstellen einer Planhinweisliste mit 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.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner "Planführungslinien ", und wählen Sie "Neuer Planleitfaden" aus. select_plan_guide

  3. Geben Sie im Dialogfeld Neue Planhinweisliste im Feld Name den Namen der Planhinweisliste ein.

  4. Geben Sie im Feld "Anweisung " die Transact-SQL-Anweisung ein, auf die der Planleitfaden angewendet werden soll.

  5. Wählen Sie in der Bereichstypliste den Entitätstyp aus, in dem die Transact-SQL-Anweisung angezeigt wird. Dadurch wird der Kontext für den Abgleich der Transact-SQL-Anweisung mit dem Planleitfaden angegeben. Mögliche Werte sind OBJECT, SQLund TEMPLATE.

  6. Geben Sie im Feld "Bereich" den Batchtext ein, in dem die Transact-SQL-Anweisung angezeigt wird. Der Batchtext darf keine USEDatenbank-Anweisung enthalten. Das Feld Bereichsbatch ist nur verfügbar, wenn SQL als Bereichstyp ausgewählt ist. 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.

  7. Geben Sie in der Liste Name von Bereichsschema den Namen des Schemas ein, in dem sich das Objekt befindet. Das Feld Name von Bereichsschema ist nur verfügbar, wenn Objekt als Bereichstyp ausgewählt ist.

  8. Geben Sie im Feld "Bereichsobjektname " den Namen der gespeicherten Transact-SQL-Prozedur, der benutzerdefinierten Skalarfunktion, der Mehrwertfunktion oder des DML-Triggers ein, in dem die Transact-SQL-Anweisung angezeigt wird. Das Feld Name von Bereichsobjekt ist nur verfügbar, wenn Objekt als Bereichstyp ausgewählt ist.

  9. Geben Sie im Feld "Parameter " den Parameternamen und den Datentyp aller Parameter ein, die in die Transact-SQL-Anweisung eingebettet sind.

    Parameter sind nur dann anwendbar, wenn eine der folgenden Aussagen zutrifft:

    • Der Bereichstyp lautet SQL oder TEMPLATE. Bei TEMPLATEdürfen Parameter nicht NULL sein.

    • Die Transact-SQL-Anweisung wird mithilfe von sp_executesql übermittelt, und ein Wert für den Parameter wird angegeben, oder SQL Server sendet intern eine Anweisung nach der Parameterisierung.

  10. Geben Sie im Feld " Hinweise" die Abfragehinweise oder den Abfrageplan ein, die auf die Transact-SQL-Anweisung angewendet werden sollen. Geben Sie eine gültige OPTION-Klausel ein, um einen oder mehrere Abfragehinweise festzulegen.

  11. Klicken Sie auf OK.

plan_guide

Erstellen eines Planleitfadens mit T-SQL

  1. Stellen Sie im Objekt-Explorer eine Verbindung mit einer Datenbank-Engine-Instanz her.

  2. Klicken Sie in der Standardleiste auf Neue Abfrage.

  3. Kopieren Sie das folgende Beispiel, fügen Sie es in das Abfragefenster ein, und klicken Sie auf Ausführen.

    -- 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).