Verwenden des USE PLAN-Abfragehinweises
Der USE PLAN-Abfragehinweis nimmt xml_plan als Argument an. xml_plan ist ein Zeichenfolgenliteral, das von dem als XML formatierten Abfrageplan abgeleitet wird, der für die Abfrage erstellt wird.
Wichtig: |
---|
Sie sollten xml_plan immer als Unicode-Literal angeben, indem Sie das Präfix N angeben (wie z. B. in N'xml_plan'). Auf diese Weise wird sichergestellt, dass keine Zeichen im Plan, die für den Unicode-Standard spezifisch sind, verloren gehen, wenn SQL Server 2005-Datenbankmodul die Zeichenfolge interpretiert. |
In SQL Server 2005 können als XML formatierte Abfragepläne auf die folgende Weise erstellt werden:
- SET SHOWPLAN_XML
Wichtig: Wenn Sie Abfragepläne mithilfe von SET SHOWPLAN_XML generieren, müssen Anführungzeichen ('), die im Plan enthalten sind, durch ein zweites Anführungzeichen geschützt werden, bevor der Plan mit dem USE PLAN-Abfragehinweis verwendet werden kann. Ein Plan, der WHERE A.varchar = 'This is a string'
enthält, muss z. B. geschützt werden, indem der Code inWHERE A.varchar = ''This is a string''
geändert wird. - SET STATISTICS XML
- Durch Abfragen der query_plan-Spalte der dynamischen Verwaltungsfunktion sys.dm_exec_query_plan.
- Mit den SQL Server Profiler-Ereignisklassen Showplan XML, Showplan XML Statistics Profile und Showplan XML For Query Compile.
Weitere Informationen zum Erstellen und Analysieren von Abfrageplänen finden Sie unter Analysieren einer Abfrage.
Der in xml_plan angegebene, als XML formatierte Abfrageplan muss anhand des XSD-Schemas Showplanxml.xsd im Installationsverzeichnis von SQL Server 2005 überprüft werden. Außerdem muss unter dem Pfad, der die <ShowPlanXML> <BatchSequence> <Batch> <Statements>
-Elemente enthält, eines der folgenden Elemente angezeigt werden:
- Ein oder mehrere
<StmtSimple>
-Elemente, von denen genau eines ein<QueryPlan>
-Unterelement enthält. - Ein
<StmtCursor>
-Element, das genau ein<CursorPlan>
-Unterelement enthält. - Ein oder mehrere
<StmtSimple>
-Elemente ohne ein<QueryPlan>
-Unterelement und ein<StmtCursor>
-Element, das ein<CursorPlan>
-Unterelement enthält.
Sie können den Plan mithilfe von USE PLAN ändern (z. B. die Verknüpfungsreihenfolge und Operatoren ändern sowie Scans und Suchen anpassen), bevor Sie ihn verwenden. Das Format des Planes muss jedoch auch weiterhin Showplanxml.xsd entsprechen. Möglicherweise sind Sie nicht in der Lage, einen Plan zu erzwingen, der geändert wurde. Wenn Sie einen Plan in einem USE PLAN-Hinweis verwenden, tritt ein Fehler auf, wenn es sich bei diesem Plan nicht um einen der Pläne handelt, die SQL Server normalerweise während der Optimierung für die Abfrage berücksichtigen würde.
Mit dem USE PLAN-Abfragehinweis generierte Abfragepläne werden genau wie andere Abfragepläne zwischengespeichert.
Einschränkungen des USE PLAN-Abfragehinweises
Datenbankänderungen, z. B. das Löschen von Indizes, können einen durch USE PLAN angegebenen Abfrageplan ungültig werden lassen. Ein Abfrageplan kann selbst dann veraltet sein, wenn in dem Plan nicht direkt auf ein gelöschtes Objekt verwiesen wird. Auf einen eindeutigen Index wird z. B. in einem Abfrageplan nicht explizit verwiesen, der Index erzwingt jedoch trotzdem eine Eindeutigkeitseinschränkung für die Daten. Ein Abfrageplan, auf den durch USE PLAN verwiesen wird, kann diese Einschränkung verwenden, damit die Verwendung bestimmter Operatoren zum Erzwingen der Eindeutigkeit vermieden wird.
Manchmal kann die Installation eines Service Packs oder einer neuen Version von SQL Server das Erzwingen eines Planes verhindern, der von einer früheren Version erstellt wurde. Daher sollten alle USE PLAN-Hinweise bei jeder Aktualisierung des Servers getestet werden.
Wenn Sie den USE PLAN-Hinweis in einer Abfrage verwenden, werden alle Verknüpfungshinweise und Indexhinweise in der gleichen Abfrage außer Kraft gesetzt.
USE PLAN kann nicht zusammen mit den FORCE ORDER-, EXPAND VIEWS-, GROUP-, UNION- oder JOIN-Abfragehinweisen verwendet werden oder wenn SET FORCEPLAN auf ON festgelegt wurde.
Nur Abfragepläne, die anderenfalls durch die typische Suchstrategie des Abfrageoptimierers gefunden werden, können mithilfe von USE PLAN erzwungen werden. Diese Pläne geben in der Regel an, dass sich ein untergeordnetes Element jeder Verknüpfung auf der Blattebene befindet. Wenn Sie USE PLAN zum Erzwingen anderer Abfragetypen verwenden, wird ein Fehler ausgelöst.
Erzwungene Abfrageplanelemente
Nicht alle Elemente des als XML formatierten Abfrageplans werden mit dem USE PLAN-Hinweis erzwungen. Elemente, die Skalarausdrücke berechnen, werden ignoriert, ebenso wie einige relationale Ausdrücke. Der Abfrageplan wird für die folgenden Arten von Elementen erzwungen:
- Baumstruktur des Planes und Reihenfolge der Auswertung.
- Ausführungsalgorithmen wie z. B. Verknüpfungstypen, Sortierung und Vereinigungen.
- Indexoperationen wie z. B. Scans, Suchen, Schnittmengen und Vereinigungen.
- Objekte, auf die explizit verwiesen wird, z. B. andere Tabellen, Indizes und Funktionen.
SQL Server erzwingt insbesondere die LogicalOp
-, PhysicalOp
- und NodeID
-Elemente, die unter dem <RelOp>
-Element vorhanden sind, sowie alle Unterelemente, die sich auf den <PhysicalOp>
-Operator beziehen. Andere Inhalte unter dem <RelOp>
-Element werden von USE PLAN nicht berücksichtigt.
Wichtig: |
---|
Informationen zu den Kardinalitätsschätzungen, die durch das <EstimateRows> -Element bestimmt werden, werden vom USE PLAN-Abfragehinweis nicht erzwungen. Da der Abfrageoptimierer Kardinalitätsschätzungen zum Ermitteln des Speicherplatzes verwendet, der für das Ausführen einer Abfrage zugewiesen wird, sollten Sie selbst dann genaue Statistiken verwalten, wenn Sie USE PLAN verwenden. Weitere Informationen finden Sie unter Indexstatistiken. |
Die folgende Tabelle listet die relationalen Operatorwerte auf, die mit dem USE PLAN-Abfragehinweis für die PhysicalOp
- und LogicalOp
-Elemente erzwungen werden, sowie alle Unterelemente, die für die einzelnen PhysicalOp
-Werte erforderlich sind. Die Tabelle enthält außerdem zusätzliche Informationen, die für die einzelnen Operatoren erforderlich sind, als Pfade im XPath-Stil, die relativ für das Unterelement sind.
PhysicalOp |
LogicalOp |
Unterelement | Zusätzliche Informationen1 |
---|---|---|---|
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
|
|
|
|
|
|
|
|
Nicht anwendbar |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
|
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
|
|
|
|
(Name der Tabellenwertfunktion lautet Object/@Table) |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
Nicht anwendbar |
|
|
|
|
1 Die Anzahl und Reihenfolge dieser Eingaben für jeden relationalen Operator muss wie in der Tabelle gezeigt vorliegen, damit ein Plan mit USE PLAN erzwungen wird.
2 Die Möglichkeit, einen Plan zu erzwingen, ist insofern eingeschränkt, als ein <RowCountSpool>-Unterelement, das in einem Plan enthalten ist, in einem erzwungenen Plan als ein <RowCountSpool>- oder <Spool>-Unterelement auftreten kann. Wenn der Plan ein <Spool>-Unterelement enthält, kann dieses in einem erzwungenen Plan als <Spool>- oder <RowCountSpool>-Unterelement auftreten.
Die Assert
-, Bitmap
-, ComputeScalar
- und PrintDataFlow
-Operatoren werden von USE PLAN ignoriert. Der Filter
-Operator wird von USE PLAN berücksichtigt, seine genaue Position im Plan kann jedoch nicht erzwungen werden.
Weitere Informationen zu den logischen und physikalischen Operatoren, die in Abfragen verwendet werden, finden Sie unter Logische und physikalische Operatoren (Referenz).
Cursorunterstützung
Sie können den USE PLAN-Abfragehinweis mit Abfragen verwenden, die statische oder schnelle Vorwärtscursor angeben, die durch Transact-SQL oder eine API-Cursorfunktion angefordert werden. Statische Transact-SQL-Cursor mit einer Vorwärtsoption werden unterstützt. Dynamische, keysetgesteuerte und Vorwärtscursor werden nicht unterstützt.
Weitere Informationen finden Sie unter Verwenden des USE PLAN-Abfragehinweises für Abfragen mit Cursorn.
Siehe auch
Konzepte
Angeben von Abfrageplänen mit Planerzwingung
Andere Ressourcen
Hilfe und Informationen
Informationsquellen für SQL Server 2005
Änderungsverlauf
Version | Verlauf |
---|---|
15. September 2007 |
|