Verwenden von SQL Server Profiler zum Erstellen und Testen von PlanhinweislistenUse SQL Server Profiler to Create and Test Plan Guides

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

Wenn Sie eine Planhinweisliste erstellen, können Sie durch Verwenden von SQL Server ProfilerSQL Server Profiler den genauen Abfragetext aufzeichnen, um diesen im statement_text -Argument der gespeicherten Prozedur sp_create_plan_guide zu verwenden. SQL Server ProfilerSQL Server Profiler When you are creating a plan guide, you can use SQL Server ProfilerSQL Server Profiler to capture the exact query text for use in the *statement_text* argument of the **sp_create_plan_guide** stored procedure. Damit kann sichergestellt werden, dass die Planhinweisliste zum Zeitpunkt der Kompilierung mit der Abfrage in Übereinstimmung gebracht wird.This helps make sure that the plan guide will be matched to the query at compile time. Nach dem Erstellen der Planhinweisliste kann SQL Server ProfilerSQL Server Profiler auch verwendet werden, um zu testen, ob die Planhinweisliste tatsächlich in Übereinstimmung mit der Abfrage gebracht wird.After the plan guide is created, SQL Server ProfilerSQL Server Profiler can also be used to test that the plan guide is, in fact, being matched to the query. Im Allgemeinen sollten Sie Planhinweislisten mithilfe von SQL Server ProfilerSQL Server Profiler testen, um zu überprüfen, dass Ihre Abfrage mit Ihrer Planhinweisliste übereinstimmt.Generally, you should test plan guides by using SQL Server ProfilerSQL Server Profiler to verify that your query is being matched to your plan guide.

Aufzeichnen von Abfragetext mithilfe von SQL Server ProfilerCapturing Query Text by Using SQL Server Profiler

Wenn Sie eine Abfrage ausführen und den Text mithilfe von SQL ServerSQL Server genau so aufzeichnen, wie er an SQL Server ProfilerSQL Server Profilerübermittelt wurde, können Sie eine Planhinweisliste des Typs SQL oder TEMPLATE erstellen, die genau mit dem Abfragetext übereinstimmt.If you run a query and capture the text exactly as it was submitted to SQL ServerSQL Server by using SQL Server ProfilerSQL Server Profiler, you can create a plan guide of type SQL or TEMPLATE that will match the query text exactly. Damit wird sichergestellt, dass die Planhinweisliste vom Abfrageoptimierer verwendet wird.This makes sure that the plan guide is used by the query optimizer.

Angenommen, die folgende Abfrage wird durch eine Anwendung als eigenständiger Batch übermittelt:Consider the following query that is submitted by an application as a stand-alone batch:

SELECT COUNT(*) AS c  
FROM Sales.SalesOrderHeader AS h  
INNER JOIN Sales.SalesOrderDetail AS d  
  ON h.SalesOrderID = d.SalesOrderID  
WHERE h.OrderDate BETWEEN '20000101' and '20050101';  

Nehmen wir jetzt an, Sie möchten diese Abfrage mithilfe eines Vorgangs zur Zusammenführungsjoins ausführen, von SHOWPLAN wird jedoch angezeigt, dass die Abfrage keine Zusammenführungsjoin verwendet.Suppose you want this query to execute using a merge join operation, but SHOWPLAN indicates that the query is not using a merge join. Es ist nicht möglich, die Abfrage direkt in der Anwendung zu ändern. Also erstellen Sie stattdessen eine Planhinweisliste, um anzugeben, dass der MERGE JOIN-Abfragehinweis zum Kompilierzeitpunkt an die Abfrage angehängt wird.You cannot change the query directly in the application, so instead you create a plan guide to specify that the MERGE JOIN query hint be appended to the query at compile time.

Um den Text genau so aufzuzeichnen, wie er von SQL ServerSQL Server empfangen wird, gehen Sie folgendermaßen vor:To capture the text of the query exactly as SQL ServerSQL Server receives it, follow these steps:

  1. Starten Sie eine SQL Server ProfilerSQL Server Profiler -Ablaufverfolgung, und stellen Sie dabei sicher, dass der SQL:BatchStarting -Ereignistyp ausgewählt ist.Start a SQL Server ProfilerSQL Server Profiler trace, making sure that the SQL:BatchStarting event type is selected.

  2. Führen Sie Abfrage mithilfe der Anwendung aus.Have the application run the query.

  3. Halten Sie die SQL Server ProfilerSQL Server Profiler -Ablaufverfolgung an.Pause the SQL Server ProfilerSQL Server Profiler Trace.

  4. Klicken Sie auf das SQL:BatchStarting -Ereignis, das der Abfrage entspricht.Click the SQL:BatchStarting event that corresponds to the query.

  5. Klicken Sie mit der rechten Maustaste auf dieses Ereignis, und wählen Sie Ereignisdaten extrahierenaus.Right-click and select Extract Event Data.

    Wichtig

    Versuchen Sie nicht, den Batchtext zu kopieren, indem Sie ihn im unteren Bereich des Profiler-Ablaufverfolgungsfensters markieren.Do not try to copy the batch text by selecting it from the lower pane of the Profiler trace window. Das kann dazu führen, dass die von Ihnen erstellte Planhinweisliste nicht mit dem ursprünglichen Batch übereinstimmt.This might cause the plan guide that you create to not match the original batch.

  6. Speichern Sie die Ereignisdaten in einer Datei.Save the event data to a file. Das ist der Batchtext.This is the batch text.

  7. Öffnen Sie die Batchtextdatei in Editor, und kopieren Sie den Text in die Zwischenablage.Open the batch text file in Notepad and copy the text to the copy and paste buffer.

  8. Erstellen Sie die Planhinweisliste, und fügen Sie den kopierten Text zwischen die Anführungszeichen ('') ein, die für das @stmt-Argument angegeben sind.Create the plan guide and paste the copied text inside the quotation marks ('') specified for the @stmt argument. Sie müssen alle einfachen Anführungszeichen im @stmt-Argument abgrenzen, indem Sie ihnen ein weiteres einfaches Anführungszeichen voranstellen.You must escape any single quotation marks in the stmt argument by preceding them with another single quotation mark. Achten Sie darauf, beim Einfügen dieser einfachen Anführungszeichen keine weiteren Zeichen hinzuzufügen oder zu entfernen.Be careful not to add or remove any other characters when you insert these single quotation marks. So muss z. B. das Datumsliteral ' 20000101 ' als '' 20000101 '' abgegrenzt werden.For example, the date literal ' 20000101 ' must be delimited as '' 20000101 ''.

Die Planhinweisliste sieht dann folgendermaßen aus:Here is the plan guide:

EXEC sp_create_plan_guide   
    @name = N'MyGuide1',  
    @stmt = N'<paste the text copied from the batch text file here>',  
    @type = N'SQL',  
    @module_or_batch = NULL,  
    @params = NULL,  
    @hints = N'OPTION (MERGE JOIN)';  

Testen von Planhinweislisten mithilfe von SQL Server ProfilerTesting Plan Guides by Using SQL Server Profiler

Um zu überprüfen, ob eine Planhinweisliste mit einer Abfrage in Übereinstimmung gebracht wird, gehen Sie folgendermaßen vor:To verify that a plan guide is being matched to a query, follow these steps:

  1. Starten Sie eine SQL Server ProfilerSQL Server Profiler -Ablaufverfolgung, und stellen Sie dabei sicher, dass der Showplan XML -Ereignistyp ausgewählt ist (dieser befindet sich unter dem Knoten Leistung ).Start a SQL Server ProfilerSQL Server Profiler trace, making certain that the Showplan XML event type is selected (located under the Performance node).

  2. Führen Sie Abfrage mithilfe der Anwendung aus.Have the application run the query.

  3. Halten Sie die SQL Server ProfilerSQL Server Profiler -Ablaufverfolgung an.Pause the SQL Server ProfilerSQL Server Profiler Trace.

  4. Suchen Sie das Showplan XML -Ereignis für die betroffene Abfrage.Find the Showplan XML event for the affected query.

    Hinweis

    Das Ereignis Showplan XML for Query Compile kann nicht verwendet werden.The Showplan XML for Query Compile event cannot be used. PlanGuideDB ist in diesem Ereignis nicht vorhanden. PlanGuideDB does not exist in that event.

  5. Wenn die Planhinweisliste vom Typ OBJECT oder SQL ist, überprüfen Sie, ob das Showplan XML -Ereignis die Attribute PlanGuideDB und PlanGuideName für die Planhinweisliste enthält, die mit der Abfrage übereinstimmen soll.If the plan guide is of type OBJECT or SQL, verify that the Showplan XML event contains the PlanGuideDB and PlanGuideName attributes for the plan guide that you expected to match the query. Handelt es sich um eine Planhinweisliste vom Typ TEMPLATE, überprüfen Sie, ob das Showplan XML -Ereignis die Attribute TemplatePlanGuideDB und TemplatePlanGuideName für die erwartete Planhinweisliste enthält.Or, in the case of a TEMPLATE plan guide, verify that the Showplan XML event contains the TemplatePlanGuideDB and TemplatePlanGuideName attributes for the expected plan guide. Damit wird die Funktionsfähigkeit der Planhinweisliste überprüft.This verifies that the plan guide is working. Diese Attribute sind im <<StmtSimple-Element der Planhinweisliste enthalten.These attributes are contained under the StmtSimple> element of the plan.

Weitere InformationenSee Also

sp_create_plan_guide (Transact-SQL) sp_create_plan_guide (Transact-SQL)