Abfragehinweis (Transact-SQL)
Aktualisiert: 15. September 2007
Gibt an, dass der angezeigte Abfragehinweis in der gesamten Abfrage verwendet werden soll. Der Abfragehinweis wirkt sich auf alle Operatoren in der Anweisung aus. Falls UNION in der Hauptabfrage vorkommt, kann nur die letzte Abfrage, die eine UNION-Operation enthält, die OPTION-Klausel aufweisen. Abfragehinweise werden im Rahmen der OPTION-Klausel angegeben. Wenn mindestens ein Abfragehinweis dazu führt, dass der Abfrageoptimierer keinen gültigen Plan generiert, wird der Fehler 8622 ausgelöst.
Wichtig: |
---|
Da der Abfrageoptimierer von SQL Server 2005 normalerweise den besten Ausführungsplan für eine Abfrage auswählt, sollten Hinweise, die <query_hint> einschließen, nur von erfahrenen Entwicklern und Datenbankadministratoren verwendet werden, wenn alle anderen Möglichkeiten sich als unzureichend erwiesen haben. |
Betrifft:
Transact-SQL-Syntaxkonventionen
Syntax
<query_hint > ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| { LOOP | MERGE | HASH } JOIN
| FAST number_rows
| FORCE ORDER
| MAXDOP number_of_processors
| OPTIMIZE FOR ( @variable_name = literal_constant [ , ...n ] )
| PARAMETERIZATION { SIMPLE | FORCED }
| RECOMPILE
| ROBUST PLAN
| KEEP PLAN
| KEEPFIXED PLAN
| EXPAND VIEWS
| MAXRECURSION number
| USE PLAN N'xml_plan'
}
Argumente
- { HASH | ORDER } GROUP
Gibt an, dass die in der GROUP BY-, DISTINCT- oder der COMPUTE-Klausel der Abfrage beschriebenen Aggregationen Hash- oder Sortiervorgänge verwenden sollen.
{ MERGE |HASH |CONCAT } UNION
Gibt an, dass alle UNION-Vorgänge mithilfe von Merge-, Hash- oder Verkettungsvorgängen für die bei UNION vorkommenden Mengen ausgeführt werden. Wenn mehr als ein UNION-Hinweis angegeben wird, wählt der Abfrageoptimierer unter den angegebenen Hinweisen die Strategie mit dem geringsten Aufwand aus.Hinweis: Wenn ein Verknüpfungshinweis (<joint_hint>) auch für ein bestimmtes verknüpftes Tabellenpaar in der FROM-Klausel angegeben ist, hat dieser Vorrang vor einem Verknüpfungshinweis (<joint_hint>) in der OPTION-Klausel.
{ LOOP | MERGE | HASH } JOIN
Gibt an, dass alle Verknüpfungsvorgänge per LOOP JOIN, MERGE JOIN oder HASH JOIN in der gesamten Abfrage ausgeführt werden. Wenn mehr als ein Verknüpfungshinweis angegeben wird, wählt der Optimierer unter den zulässigen Hinweisen die Strategie mit dem geringsten Aufwand aus.Wenn in derselben Abfrage auch ein Verknüpfungshinweis für ein bestimmtes Tabellenpaar angegeben ist, hat dieser Verknüpfungshinweis Vorrang bei der Verknüpfung der beiden Tabellen; die Abfragehinweise müssen jedoch auch berücksichtigt werden. Deshalb kann der Verknüpfungshinweis für das Tabellenpaar nur die Auswahl der zulässigen Verknüpfungsmethoden für den Abfragehinweis einschränken. Weitere Informationen finden Sie unter Hinweise (Transact-SQL).
- FAST number_rows
Gibt an, dass die Abfrage für den schnellen Abruf der ersten number_rows. (eine nicht negative ganze Zahl) optimiert wird. Nachdem die ersten number_rows zurückgegeben wurden, wird die Abfrage fortgesetzt und das vollständige Resultset erstellt.
FORCE ORDER
Gibt an, dass die von der Abfragesyntax angegebene Verknüpfungsreihenfolge während der Abfrageoptimierung beibehalten wird.Hinweis: Die Verwendung von FORCE ORDER hat keine Auswirkung auf das mögliche Rollentauschverhalten des Abfrageoptimierers. Weitere Informationen finden Sie unter Grundlegendes zu Hashverknüpfungen. Informationen zur Vorgehensweise des Abfrageoptimierers von SQL Server beim Erzwingen des FORCE ORDER-Hinweises, wenn eine Abfrage eine Sicht enthält, finden Sie unter Sichtauflösung.
- MAXDOP number
Setzt die Konfigurationsoption max degree of parallelism von sp_configure für die Abfrage außer Kraft, in der diese Option angegeben wird. Der MAXDOP-Abfragehinweis kann den mit sp_configure konfigurierten Wert übersteigen. Alle semantischen Regeln, die mit der Konfigurationsoption max degree of parallelism verwendet werden können, stehen beim Verwenden des MAXDOP-Abfragehinweises zur Verfügung. Weitere Informationen finden Sie unter max degree of parallelism (Option).
- OPTIMIZE FOR
Weist den Abfrageoptimierer an, einen bestimmten Wert für eine lokale Variable zu verwenden, wenn die Abfrage kompiliert und optimiert wird. Dieser Wert wird nur während der Abfrageoptimierung verwendet, nicht während der Abfrageausführung. OPTIMIZE FOR kann dem Parametererkennungsverhalten des Abfrageoptimierers entgegenwirken oder kann beim Erstellen von Planhinweislisten verwendet werden. Weitere Informationen finden Sie unter Erneutes Kompilieren gespeicherter Prozeduren und Optimieren von Abfragen in bereitgestellten Anwendungen mit Planhinweislisten.
- @variable_name
Der Name einer lokalen Variablen, die in einer Abfrage verwendet wird und der ein Wert für die Verwendung mit dem OPTIMIZE FOR-Abfragehinweis zugewiesen werden kann.
- literal_constant
Ein Literalkonstantenwert, dem @variable_name für die Verwendung mit dem OPTIMIZE FOR-Abfragehinweis zugewiesen werden soll. literal_constant wird nur während der Abfrageoptimierung verwendet, nicht während der Abfrageausführung als Wert von @variable_name. Für literal_constant ist jeder SQL Server-Systemdatentyp möglich, der als Literalkonstante ausgedrückt werden kann. Der Datentyp von literal_constant muss implizit in den Datentyp konvertierbar sein, auf den @variable_name in der Abfrage verweist.
- ,…n
Gibt an, dass mehr als einem @variable_name eine literal_constant für die Verwendung mit dem OPTIMIZE FOR-Abragehinweis zugewiesen werden kann.
PARAMETERIZATION { SIMPLE | FORCED }
Gibt die Parametrisierungsregeln an, die der SQL Server-Abfrageoptimierer bei der Kompilierung auf die Abfrage anwendet.Wichtig: Der PARAMETERIZATION-Abfragehinweis kann nur innerhalb einer Planhinweisliste angegeben werden. Er kann nicht direkt innerhalb einer Abfrage angegeben werden. Mit SIMPLE wird der Abfrageoptimierer angewiesen, Einfache Parametrisierung auszuführen. Mit FORCED wird der Optimierer angewiesen, Erzwungene Parametrisierung auszuführen. Mit dem PARAMETERIZATION-Abfragehinweis wird die aktuelle Einstellung der Option PARAMETERIZATION database SET innerhalb einer Planhinweisliste außer Kraft gesetzt. Weitere Informationen finden Sie unter Angeben des Abfrageparametrisierungsverhaltens mithilfe von Planhinweislisten.
RECOMPILE
Weist SQL Server 2005-Datenbankmodul an, den für die Abfrage generierten Abfrageplan nach der Ausführung zu verwerfen. Dadurch wird der Abfrageoptimierer gezwungen, einen Abfrageplan erneut zu kompilieren, wenn dieselbe Abfrage das nächste Mal ausgeführt wird. Ohne das Angeben von RECOMPILE werden Abfragepläne von Datenbankmodul zwischengespeichert und wiederverwendet. Beim Kompilieren von Abfrageplänen verwendet der RECOMPILE-Abfragehinweis die aktuellen Werte von lokalen Variablen in der Abfrage und, falls sich die Abfrage innerhalb einer gespeicherten Prozedur befindet, die an Parameter übergebenen aktuellen Werte.RECOMPILE ist eine hilfreiche Alternative zum Erstellen einer gespeicherten Prozedur, die die WITH RECOMPILE-Klausel verwendet, wenn nicht die gesamte gespeicherte Prozedur, sondern nur eine Teilmenge davon erneut kompiliert werden muss. Weitere Informationen finden Sie unter Erneutes Kompilieren gespeicherter Prozeduren. RECOMPILE ist auch beim Erstellen von Planhinweislisten hilfreich. Weitere Informationen finden Sie unter Optimieren von Abfragen in bereitgestellten Anwendungen mit Planhinweislisten.
ROBUST PLAN
Zwingt den Abfrageoptimierer zu einer Vorgehensweise, bei der der Schwerpunkt auf der maximalen potenziellen Zeilengröße liegt. Dies geht möglicherweise zu Lasten der Leistung. Bei der Verarbeitung der Abfrage müssen möglicherweise Zwischentabellen und Operatoren Zeilen speichern und verarbeiten, die größer sind als alle Eingabezeilen. Die Zeilen können so groß sein, dass der jeweilige Operator in einigen Fällen die Zeile nicht verarbeiten kann. In diesem Fall gibt Datenbankmodul während der Ausführung der Abfrage einen Fehler aus. Durch das Verwenden von ROBUST PLAN weisen Sie den Abfrageoptimierer an, keine Abfragepläne in Betracht zu ziehen, für die möglicherweise dieses Problem auftritt.Ist eine solche Vorgehensweise nicht möglich, gibt der Abfrageoptimierer einen Fehler zurück, statt die Fehlererkennung auf die Abfrageausführung zu verschieben. Die Zeilen können Spalten variabler Länge aufweisen. Datenbankmodul lässt die Definition von Zeilen zu, deren maximale potenzielle Größe von Datenbankmodul nicht mehr verarbeitet werden kann. Trotz der maximalen potenziellen Größe speichert eine Anwendung im Allgemeinen Zeilen, deren tatsächliche Größe innerhalb der Höchstwerte liegt, die Datenbankmodul verarbeiten kann. Wenn Datenbankmodul eine Zeile ermittelt, die zu lang ist, wird ein Ausführungsfehler zurückgegeben.
- KEEP PLAN
Zwingt den Abfrageoptimierer, den geschätzten Neukompilierungsschwellenwert für eine Abfrage zu lockern. Der geschätzte Neukompilierungsschwellenwert gibt den Punkt an, bei dem eine Abfrage automatisch erneut kompiliert wird, wenn für eine Tabelle die geschätzte Anzahl von Änderungen für indizierte Spalten durch Ausführen von UPDATE-, DELETE- oder INSERT-Anweisungen vorgenommen wurden. Durch Angeben von KEEP PLAN wird sichergestellt, dass eine Abfrage nicht zu häufig erneut kompiliert wird, wenn an einer Tabelle mehrere Aktualisierungen ausgeführt werden.
- KEEPFIXED PLAN
Zwingt den Abfrageoptimierer, die Abfrage aufgrund von Änderungen in den Statistiken nicht erneut zu kompilieren. Durch Angeben von KEEPFIXED PLAN wird sichergestellt, dass eine Abfrage nur dann erneut kompiliert wird, wenn das Schema der zugrunde liegenden Tabellen geändert wird oder für diese Tabellen sp_recompile ausgeführt wird.
EXPAND VIEWS
Gibt an, dass die indizierten Sichten erweitert werden und dass der Abfrageoptimierer eine indizierte Sicht nicht als Ersatz für irgendeinen Teil der Abfrage ansieht. Eine Sicht wird erweitert, indem der Sichtname im Abfragetext durch die Sichtdefinition ersetzt wird.Dieser Abfragehinweis lässt die direkte Verwendung von indizierten Sichten und Indizes für indizierte Sichten im Abfrageplan praktisch nicht zu.
Die indizierte Sicht wird nur dann nicht erweitert, wenn auf die Sicht im SELECT-Teil der Abfrage direkt verwiesen wird und WITH (NOEXPAND) oder WITH (NOEXPAND, INDEX( index_val [ ,...n ] ) ) angegeben ist. Weitere Informationen zum Abfragehinweis WITH (NOEXPAND) finden Sie unter FROM (Transact-SQL).
Der Hinweis wirkt sich nur auf die Sichten im SELECT-Teil von Anweisungen aus, einschließlich der Sichten in INSERT-, UPDATE- und DELETE-Anweisungen.
MAXRECURSION number
Gibt die maximal zulässige Anzahl von Rekursionen für diese Abfrage an. number ist eine nicht negative ganze Zahl zwischen 0 und 32767. Wenn 0 angegeben ist, wird keine Beschränkung angewendet. Wenn diese Option nicht angegeben wird, beträgt das Standardlimit für den Server 100.Wenn der angegebene Wert bzw. der Standardwert für MAXRECURSION während der Ausführung der Abfrage erreicht wird, wird die Abfrage beendet und ein Fehler wird zurückgegeben.
Aufgrund dieses Fehlers wird für alle Änderungen aufgrund der Anweisung ein Rollback ausgeführt. Wenn es sich hierbei um eine SELECT-Anweisung handelt, können Teilergebnisse oder keine Ergebnisse zurückgegeben werden. Teilergebnisse schließen möglicherweise nicht alle Zeilen auf Rekursionsebenen ein, die über die angegebene maximale Rekursionsebene hinausgehen.
Weitere Informationen finden Sie unter WITH common_table_expression (Transact-SQL).
- USE PLAN N**'xml_plan'**
Zwingt den Abfrageoptimierer, einen vorhandenen Abfrageplan für eine Abfrage zu verwenden, die mit 'xml_plan' angegeben ist. Weitere Informationen finden Sie unter Angeben von Abfrageplänen mit Planerzwingung. USE PLAN kann nicht für INSERT-, UPDATE- oder DELETE-Anweisungen angegeben werden.
Hinweise
Abfragehinweise können nicht in einer INSERT-Anweisung angegeben werden, es sei denn eine SELECT-Klausel wird innerhalb der Anweisung verwendet.
Abfragehinweise können nur in der Abfrage der obersten Ebene angegeben werden, nicht in Unterabfragen.
Beispiele
A. Verwenden von MERGE JOIN
Im folgenden Beispiel wird der JOIN
-Vorgang in der Abfrage durch MERGE JOIN
ausgeführt.
USE AdventureWorks;
GO
SELECT *
FROM Sales.Customer AS c
INNER JOIN Sales.CustomerAddress AS ca
ON c.CustomerID = ca.CustomerID
WHERE TerritoryID = 5
OPTION (MERGE JOIN);
GO
B. Verwenden von OPTIMIZE FOR
Im folgenden Beispiel wird der Abfrageoptimierer angewiesen, beim Optimieren der Abfrage den Wert 'Seattle'
für die lokale Variable @city_name
zu verwenden.
DECLARE @city_name nvarchar(30)
SET @city_name = 'Ascheim'
SELECT * FROM Person.Address
WHERE City = @city_name
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle') );
GO
C. Verwenden von MAXRECURSION
MAXRECURSION kann verwendet werden, um zu verhindern, dass ein fehlerhaft formatierter allgemeiner Tabellenausdruck in eine Endlosschleife gerät. Im folgenden Beispiel wird absichtlich eine Endlosschleife erstellt. Außerdem wird MAXRECURSION
verwendet, um die Anzahl der Rekursionsebenen auf zwei zu beschränken.
USE AdventureWorks;
GO
--Creates an infinite loop
WITH cte (EmployeeID, ManagerID, Title) as
(
SELECT EmployeeID, ManagerID, Title
FROM HumanResources.Employee
WHERE ManagerID IS NOT NULL
UNION ALL
SELECT cte.EmployeeID, cte.ManagerID, cte.Title
FROM cte
JOIN HumanResources.Employee AS e
ON cte.ManagerID = e.EmployeeID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT EmployeeID, ManagerID, Title
FROM cte
OPTION (MAXRECURSION 2);
GO
Nach dem Beheben des Codierungsfehlers ist MAXRECURSION
nicht mehr erforderlich.
D. Verwenden von UNION
Im folgenden Beispiel wird der MERGE UNION
-Abfragehinweis verwendet.
USE AdventureWorks ;
GO
SELECT *
FROM HumanResources.Employee e1
UNION
SELECT *
FROM HumanResources.Employee e2
OPTION (MERGE UNION) ;
GO
E. Verwenden von HASH GROUP und FAST
Im folgenden Beispiel werden die Abfragehinweise HASH GROUP
und FAST
verwendet.
USE AdventureWorks ;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10) ;
GO
F. Verwenden von MAXDOP
Im folgenden Beispiel wird der MAXDOP
-Abfragehinweis verwendet.
USE AdventureWorks ;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (MAXDOP 2);
GO
Siehe auch
Verweis
Hilfe und Informationen
Informationsquellen für SQL Server 2005
Änderungsverlauf
Version | Verlauf |
---|---|
15. September 2007 |
|
17. Juli 2006 |
|