Migrieren von Abfrageplänen

Im Allgemeinen führt die Aktualisierung einer Datenbank auf SQL Server 2008 zu einer besseren Abfrageleistung. Bei unternehmenswichtigen Abfragen, deren Leistung sorgfältig optimiert wurde, möchten Sie jedoch möglicherweise vor der Aktualisierung die entsprechenden Abfragepläne aufzeichnen. Zu diesem Zweck können Sie für jede Abfrage eine Planhinweisliste erstellen. Falls der Abfrageoptimierer nach der Aktualisierung für immer mehr Abfragen einen weniger effizienten Plan wählt, können Sie die Planhinweislisten aktivieren und den Abfrageoptimierer zwingen, die alten Pläne zu verwenden.

Führen Sie die folgenden Schritte durch, um vor der Aktualisierung Planhinweislisten zu erstellen:

  1. Zeichnen Sie den aktuellen Plan für jede unternehmenswichtige Abfrage auf, indem Sie die gespeicherte Prozedur sp_create_plan_guide verwenden und den Abfrageplan im USE PLAN-Abfragehinweis angeben.

  2. Vergewissern Sie sich, dass die Planhinweisliste auf die Abfrage angewendet wird.

  3. Aktualisieren Sie die Datenbank auf SQL Server 2008.

    Die Pläne bestehen in der aktualisierten Datenbank in den Planhinweislisten fort und können gegebenenfalls herangezogen werden, falls es nach der Aktualisierung zu einer rückläufigen Entwicklung bei der Planverwendung kommt.

    Wir empfehlen jedoch, die Planhinweislisten nicht sofort nach der Aktualisierung zu aktivieren, da Sie sonst eventuell nicht die Vorzüge besserer Pläne in der neuen Version oder die Vorteile von Neukompilierungen aufgrund aktualisierter Statistiken nutzen können.

  4. Falls nach der Aktualisierung weniger effiziente Pläne gewählt werden, können Sie alle oder einen Teil der Planhinweislisten aktivieren, um die neuen Pläne außer Kraft zu setzen.

Beispiel

Im folgenden Beispiel wird gezeigt, wie Sie vor der Aktualisierung durch Erstellen einer Planhinweisliste den Plan für eine Abfrage aufzeichnen können.

Schritt 1: Abrufen des Plans

Der in der Planhinweisliste aufgezeichnete Abfrageplan muss im XML-Format vorliegen. Abfragepläne im XML-Format können auf folgende Weise erstellt werden:

Weitere Informationen zum Erstellen und Analysieren von Abfrageplänen finden Sie unter Analysieren einer Abfrage.

Im folgenden Beispiel wird der Abfrageplan für die Anweisung SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC; abgerufen, indem dynamische Verwaltungssichten abgefragt werden.

USE AdventureWorks;
GO
SELECT query_plan
    FROM sys.dm_exec_query_stats AS qs 
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, DEFAULT, DEFAULT) AS qp
    WHERE st.text LIKE N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;%';
GO

Schritt 2: Erstellen des Planhinweises zum Erzwingen des Plans

Fügen Sie den in der Planhinweisliste enthaltenen (und mit einer der oben beschriebenen Methoden bezogenen) Abfrageplan im XML-Format als Zeichenfolgenliteral in den USE PLAN-Abfragehinweis ein, der in der OPTION-Klausel von sp_create_plan_guide angegeben ist.

Grenzen Sie alle im XML-Plan enthaltenen Anführungszeichen (') durch ein zweites Anführungszeichen ab, bevor Sie die Planhinweisliste erstellen. Ein Plan, der WHERE A.varchar = 'This is a string' enthält, muss z. B. abgegrenzt werden, indem der Code zu WHERE A.varchar = ''This is a string'' geändert wird.

Im folgenden Beispiel wird eine Planhinweisliste für den in Schritt 1 abgerufenen Abfrageplan erstellt und der XML-Showplan für die Abfrage in den @hints-Parameter eingefügt. Aus Platzgründen ist im Beispiel nur ein Teil des Showplans angegeben.

EXECUTE sp_create_plan_guide 
@name = N'Guide1',
@stmt = N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION(USE PLAN N''<ShowPlanXML xmlns=''''https://schemas.microsoft.com/sqlserver/2004/07/showplan'''' 
    Version=''''0.5'''' Build=''''9.00.1116''''>
    <BatchSequence><Batch><Statements><StmtSimple>
    …
    </StmtSimple></Statements></Batch>
    </BatchSequence></ShowPlanXML>'')';
GO

Schritt 3: Überprüfen, ob die Planhinweisliste auf die Abfrage angewendet wird

Führen Sie die Abfrage noch einmal aus, und überprüfen Sie den erzeugten Abfrageplan. Dieser Plan sollte mit dem in der Planhinweisliste angegebenen Plan übereinstimmen.