Abfragehinweise (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance SQL-Datenbank in Microsoft Fabric
Abfragehinweise sind Hinweise, die im Bereich einer Abfrage verwendet werden. Sie wirken sich auf alle Operatoren in der Anweisung aus. Wenn UNION
an der Hauptabfrage beteiligt ist, kann nur die letzte Abfrage, die einen UNION
Vorgang umfasst, die OPTION
Klausel aufweisen. Abfragehinweise werden als Teil der OPTION-Klausel angegeben. Fehler 8622 tritt auf, wenn mindestens ein Abfragehinweis dazu führt, dass der Abfrageoptimierer keinen gültigen Plan generiert.
Achtung
Da der SQL Server-Abfrageoptimierer in der Regel den besten Ausführungsplan für eine Abfrage auswählt, wird empfohlen, dass nur erfahrene Entwickler und Datenbankadministratoren Hinweise verwenden, wenn alle anderen Möglichkeiten sich als unbefriedigend erwiesen haben.
Anwendungsbereich:
Transact-SQL-Syntaxkonventionen
Syntax
<query_hint> ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| { LOOP | MERGE | HASH } JOIN
| DISABLE_OPTIMIZED_PLAN_FORCING
| EXPAND VIEWS
| FAST <integer_value>
| FORCE ORDER
| { FORCE | DISABLE } EXTERNALPUSHDOWN
| { FORCE | DISABLE } SCALEOUTEXECUTION
| IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
| KEEP PLAN
| KEEPFIXED PLAN
| MAX_GRANT_PERCENT = <numeric_value>
| MIN_GRANT_PERCENT = <numeric_value>
| MAXDOP <integer_value>
| MAXRECURSION <integer_value>
| NO_PERFORMANCE_SPOOL
| OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ...n ] )
| OPTIMIZE FOR UNKNOWN
| PARAMETERIZATION { SIMPLE | FORCED }
| QUERYTRACEON <integer_value>
| RECOMPILE
| ROBUST PLAN
| USE HINT ( <use_hint_name> [ , ...n ] )
| USE PLAN N'<xml_plan>'
| TABLE HINT ( <exposed_object_name> [ , <table_hint> [ [ , ] ...n ] ] )
| FOR TIMESTAMP AS OF '<point_in_time>'
}
<table_hint> ::=
{ NOEXPAND [ , INDEX ( <index_value> [ , ...n ] ) | INDEX = ( <index_value> ) ]
| INDEX ( <index_value> [ , ...n ] ) | INDEX = ( <index_value> )
| FORCESEEK [ ( <index_value> ( <index_column_name> [ , ... ] ) ) ]
| FORCESCAN
| HOLDLOCK
| NOLOCK
| NOWAIT
| PAGLOCK
| READCOMMITTED
| READCOMMITTEDLOCK
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| SNAPSHOT
| SPATIAL_WINDOW_MAX_CELLS = <integer_value>
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
<use_hint_name> ::=
{ 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
| 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
| 'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES'
| 'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES'
| 'DISABLE_BATCH_MODE_ADAPTIVE_JOINS'
| 'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK'
| 'DISABLE_DEFERRED_COMPILATION_TV'
| 'DISABLE_INTERLEAVED_EXECUTION_TVF'
| 'DISABLE_OPTIMIZED_NESTED_LOOP'
| 'DISABLE_OPTIMIZER_ROWGOAL'
| 'DISABLE_PARAMETER_SNIFFING'
| 'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK'
| 'DISABLE_TSQL_SCALAR_UDF_INLINING'
| 'DISALLOW_BATCH_MODE'
| 'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS'
| 'ENABLE_QUERY_OPTIMIZER_HOTFIXES'
| 'FORCE_DEFAULT_CARDINALITY_ESTIMATION'
| 'FORCE_LEGACY_CARDINALITY_ESTIMATION'
| 'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
| 'QUERY_PLAN_PROFILE'
}
Argumente
{ HASH | ORDER } GROUP
Gibt an, dass Aggregationen, die die Abfrage GROUP BY
oder DISTINCT
Klausel beschreibt, Hashing oder Sortierung verwenden sollen.
{ MERGE | HASH | CONCAT } UNION
Gibt an, dass alle UNION
Vorgänge durch Zusammenführen, Hashing oder Verketten von UNION
Sätzen ausgeführt werden. Wenn mehrere UNION
Hinweise angegeben werden, wählt der Abfrageoptimierer die am wenigsten teure Strategie aus den angegebenen Hinweisen aus.
{ LOOP | MERGE | HASH } JOIN
Gibt an, dass alle Verknüpfungsvorgänge von LOOP JOIN
, , MERGE JOIN
oder HASH JOIN
in der gesamten Abfrage ausgeführt werden. Wenn Sie mehr als einen Joinhinweis angeben, wählt der Optimierer unter den zulässigen Hinweisen die Strategie mit dem geringsten Aufwand aus.
Wenn Sie einen Verknüpfungshinweis in der Klausel derselben Abfrage für ein bestimmtes FROM
Tabellenpaar angeben, hat dieser Verknüpfungshinweis Vorrang bei der Verknüpfung der beiden Tabellen. Die Abfragehinweise müssen jedoch auch berücksichtigt werden. Der Joinhinweis kann für das Tabellenpaar nur die Auswahl der zulässigen Joinmethoden für den Abfragehinweis einschränken. Weitere Informationen finden Sie unter "Verknüpfungshinweise".
DISABLE_OPTIMIZED_PLAN_FORCING
Gilt für: SQL Server (ab SQL Server 2022 (16.x))
Deaktiviert die Erzwingung des optimierten Plans für eine Abfrage.
Dadurch wird der Kompilierungsaufwand für wiederholte erzwungene Abfragen reduziert. Nachdem der Abfrageausführungsplan generiert wurde, werden bestimmte Kompilierungsschritte für eine Wiederverwendung als Replay-Optimierungsskript gespeichert. Ein Replay-Optimierungsskript wird als Teil des komprimierten Showplan-XML im Abfragespeicher in einem ausgeblendeten Attribut vom Typ OptimizationReplay
gespeichert.
EXPAND VIEWS
Gibt an, dass die indizierten Sichten erweitert werden. Gibt auch an, dass der Abfrageoptimierer keine indizierte Sicht als Ersatz für einen Abfrageteil berücksichtigt. Eine Sicht wird erweitert, wenn die Sichtdefinition im Abfragetext den Sichtnamen ersetzt.
Dieser Abfragehinweis lässt die direkte Verwendung von indizierten Sichten und Indizes für indizierte Sichten im Abfrageplan praktisch nicht zu.
Hinweis
Die indizierte Ansicht bleibt kondensiert, wenn ein direkter Verweis auf die Ansicht im Abfrageteil SELECT
vorhanden ist. Die Ansicht bleibt auch komprimiert, wenn Sie WITH (NOEXPAND)
oder WITH (NOEXPAND, INDEX( <index_value> [ , *...n* ] ) )
angeben. Weitere Informationen zum Abfragehinweis NOEXPAND
finden Sie unter Verwenden von NOEXPAND.
Der Hinweis wirkt sich nur auf die Ansichten im Teil der Anweisungen SELECT
aus, einschließlich der Ansichten in INSERT
, , UPDATE
und DELETE
MERGE
Anweisungen.
FAST Integerwert
Gibt an, dass die Abfrage für den schnellen Abruf der ersten Integerwert Zeilen optimiert ist. Dieses Ergebnis ist eine nicht negative ganze Zahl. Nachdem die ersten Integerwert Zeilen zurückgegeben wurden, wird die Abfrage fortgesetzt und erzeugt das vollständige Resultset.
FORCE ORDER
Gibt an, dass die von der Abfragesyntax angegebene Joinreihenfolge während der Abfrageoptimierung beibehalten wird. Die Verwendung FORCE ORDER
wirkt sich nicht auf mögliche Rollenumkehrverhalten des Abfrageoptimierers aus.
Hinweis
In einer MERGE
Anweisung wird vor der Zieltabelle als Standardbeitrittsreihenfolge auf die Quelltabelle zugegriffen, es sei denn, die WHEN SOURCE NOT MATCHED
Klausel ist angegeben. Wenn Sie dieses Standardverhalten angeben FORCE ORDER
, wird dieses Standardverhalten beibehalten.
{ FORCE | DISABLE } EXTERNALPUSHDOWN
Erzwingen oder Deaktivieren der Weitergabe der Berechnung von qualifizierenden Ausdrücken in Hadoop. Gilt nur für Abfragen mit PolyBase. Verschiebt sich nicht auf Azure Storage.
{ FORCE | DISABLE } SCALEOUTEXECUTION
Hiermit wird die Scale Out-Ausführung von PolyBase-Abfragen erzwungen oder deaktiviert, die externe Tabellen in SQL Server 2019-Big Data-Clustern verwenden. Dieser Hinweis wird nur von einer Abfrage berücksichtigt, die die Masterinstanz eines SQL-Big Data-Clusters verwendet. Die Skalierung erfolgt über den Computepool des Big Data-Clusters.
KEEP PLAN
Ändert die Neukompilierungsschwellenwerte für temporäre Tabellen und macht sie identisch mit den Schwellenwerten für permanente Tabellen. Der geschätzte Neukompilierungsschwellenwert startet eine automatische Neukompilierung für die Abfrage, wenn die geschätzte Anzahl der indizierten Spaltenänderungen an einer Tabelle vorgenommen wird, indem eine der folgenden Anweisungen ausgeführt wird:
UPDATE
DELETE
MERGE
INSERT
Durch Angeben KEEP PLAN
wird sichergestellt, dass eine Abfrage nicht so häufig neu kompiliert wird, wenn mehrere Aktualisierungen einer Tabelle vorhanden sind.
KEEPFIXED PLAN
Zwingt den Abfrageoptimierer, die Abfrage aufgrund von Änderungen in den Statistiken nicht erneut zu kompilieren. Durch Angeben KEEPFIXED PLAN
wird sichergestellt, dass eine Abfrage nur dann neu kompiliert wird, wenn sich das Schema der zugrunde liegenden Tabellen ändert oder für sp_recompile
diese Tabellen ausgeführt wird.
IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
Gilt für: SQL Server (ab SQL Server 2012 (11.x)).
Verhindert, dass die Abfrage einen nicht gruppierten speicheroptimierten Columnstore-Index verwendet. Wenn die Abfrage den Abfragehinweis enthält, der die Verwendung des Columnstore-Indexes verhindert, sowie einen Indexhinweis, der die Verwendung eines Columnstore-Index festlegt, besteht ein Konflikt zwischen den Hinweisen, und die Abfrage gibt einen Fehler zurück.
MAX_GRANT_PERCENT = <numeric_value>
Gilt für: SQL Server (ab SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 und Azure SQL-Datenbank
Die maximale Größe der Arbeitsspeichererteilung in PERCENT
der konfigurierten Speichergrenze. Die Abfrage wird diese Begrenzung garantiert nicht überschreiten, wenn die Abfrage in einem benutzerdefinierten Ressourcenpool ausgeführt wird. Wenn die Abfrage in diesem Fall nicht über den erforderlichen Mindestspeicher verfügt, löst das System einen Fehler aus. Wenn eine Abfrage im Systempool ausgeführt wird (Standard), erhält sie mindestens den für die Ausführung erforderlichen Arbeitsspeicher. Die tatsächliche Begrenzung kann niedriger sein, wenn die Resource Governor-Einstellung niedriger ist als die durch diesen Hinweis angegebene Begrenzung. Gültige Werte liegen in einem Bereich zwischen 0,0 und 100,0.
Der Hinweis zur Speichererteilung ist für die Indexerstellung oder die Indexerstellung nicht verfügbar.
MIN_GRANT_PERCENT = <numeric_value>
Gilt für: SQL Server (ab SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 und Azure SQL-Datenbank
Die mindeste Größe der Speichererteilung in PERCENT
der konfigurierten Speichergrenze. Für die Abfrage wird MAX(required memory, min grant)
garantiert,weil zumindest der für das Starten einer Abfrage benötigte Speicher erforderlich ist. Gültige Werte liegen in einem Bereich zwischen 0,0 und 100,0.
Die Option für die min_grant_percent Speichererteilung überschreibt die sp_configure
-Option (mindester Arbeitsspeicher pro Abfrage (KB)), unabhängig von der Größe. Der Hinweis zur Speichererteilung ist für die Indexerstellung oder die Indexerstellung nicht verfügbar.
MAXDOP <integer_value>
Gilt für: SQL Server (ab SQL Server 2008 (10.0.x)) und Azure SQL-Datenbank
Überschreibt die Konfigurationsoption max degree of parallelism von sp_configure
. Überschreibt auch den Resource Governor für die Abfrage, die diese Option angibt. Der MAXDOP
Abfragehinweis kann den mit sp_configure
. Wenn MAXDOP
der mit Ressourcenkontrolle konfigurierte Wert überschritten wird, verwendet die Datenbank-Engine den Wert "Ressourcenkontrolle"MAXDOP
, der in ALTER WORKLOAD GROUP beschrieben ist. Alle semantischen Regeln, die mit der maximalen Parallelitätskonfigurationsoption verwendet werden, sind anwendbar, wenn Sie den MAXDOP
Abfragehinweis verwenden. Weitere Informationen finden Sie unter Konfigurieren der Serverkonfigurationsoption Max. Grad an Parallelität.
Warnung
Wenn MAXDOP
auf Null festgelegt ist, wählt der Server den maximalen Grad der Parallelität aus.
MAXRECURSION <integer_value>
Gibt die maximale Anzahl der für diese Abfrage zulässigen Rekursionen an. Die Zahl ist eine positive ganze Zahl zwischen 0 und 32.767. Wenn 0 angegeben wird, wird keine Beschränkung angewendet. Wenn diese Option nicht angegeben wird, beträgt das Standardlimit für den Server 100.
Wenn die angegebene oder Standardnummer für MAXRECURSION
den Grenzwert während der Abfrageausführung erreicht wird, endet die Abfrage, und ein Fehler wird zurückgegeben.
Aufgrund dieses Fehlers wird für alle Änderungen aufgrund der Anweisung ein Rollback ausgeführt. Wenn es sich bei der Anweisung um eine SELECT
Anweisung handelt, werden teilweise Ergebnisse oder keine Ergebnisse zurückgegeben. 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.
NO_PERFORMANCE_SPOOL
Gilt für: SQL Server (ab SQL Server 2016 (13.x)) und Azure SQL-Datenbank.
Verhindert, dass ein Spool-Operator zu Abfrageplänen hinzugefügt wird (mit Ausnahme der Pläne, bei denen der Spool-Operator eine gültige Update-Semantik garantieren muss). In einigen Szenarios kann der Spool-Operator die Leistung beeinträchtigen. Der Spool-Operator verwendet beispielsweise tempdb
und tempdb
Wenn in den Spoolvorgängen viele Abfragen gleichzeitig ausgeführt werden, kann es zu einem Konflikt kommen.
OPTIMIZE FOR ( @variable_name { UNKNOWN | = <literal_constant> } [ , ...n ] )
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.
@variable_name
Der Name einer lokalen Variablen, die in einer Abfrage verwendet wird, der ein Wert für die Verwendung mit dem
OPTIMIZE FOR
Abfragehinweis zugewiesen werden kann.UNKNOWN
Gibt an, dass der Abfrageoptimierer statt des Anfangswerts statistische Daten verwenden soll, um während der Abfrageoptimierung den Wert einer lokalen Variablen zu bestimmen.
literal_constant
Ein Literalkonstantenwert, der @variable_name für die Verwendung mit dem
OPTIMIZE FOR
Abfragehinweis zugewiesen werden soll. literal_constant wird nur während der Abfrageoptimierung verwendet, nicht als Wert von @variable_name während der Abfrageausführung. literal_constant kann einen beliebigen SQL Server-Systemdatentyp aufweisen, der als Literalkonstante dargestellt werden kann. Der Datentyp von literal_constant muss implizit in den Datentyp konvertierbar sein, auf den @variable_name in der Abfrage verweist.
OPTIMIZE FOR kann dem Erkennungsverhalten der Standardparameter des Optimierers entgegenwirken. Verwenden OPTIMIZE FOR
Sie auch beim Erstellen von Planhandbüchern. Weitere Informationen finden Sie unter Erneutes Kompilieren einer gespeicherten Prozedur.
OPTIMIZE FOR UNKNOWN
Weist den Abfrageoptimierer an, die durchschnittliche Selektorität des Prädikats für alle Spaltenwerte zu verwenden, anstatt den Laufzeitparameterwert zu verwenden, wenn die Abfrage kompiliert und optimiert wird.
Wenn OPTIMIZE FOR @variable_name = <literal_constant>
und OPTIMIZE FOR UNKNOWN
im selben Abfragehinweis verwendet werden, verwendet der Abfrageoptimierer die für einen bestimmten Wert angegebene literal_constant. Der Abfrageoptimierer verwendet UNKNOWN für die übrigen Variablenwerte. Diese Werte werden nur während der Abfrageoptimierung verwendet, nicht während der Abfrageausführung.
PARAMETERIZATION { SIMPLE | FORCED }
Gibt die Parameterisierungsregeln an, die der SQL Server-Abfrageoptimierer beim Kompilieren auf die Abfrage anwendet.
Wichtig
Der PARAMETERIZATION
Abfragehinweis kann nur in einer Plananleitung angegeben werden, um die aktuelle Einstellung der PARAMETERIZATION
Datenbankoption SET
außer Kraft zu setzen. Er kann nicht direkt innerhalb einer Abfrage angegeben werden.
Weitere Informationen finden Sie unter Angeben des Abfrageparametrisierungsverhaltens mithilfe von Planhinweislisten.
SIMPLE
weist den Abfrageoptimierer an, eine einfache Parametrisierung zu versuchen. FORCED
weist den Abfrageoptimierer an, die erzwungene Parametrisierung zu versuchen. Weitere Informationen finden Sie unter „Erzwungene Parametrisierung“ im Handbuch zur Architektur der Abfrageverarbeitung und unter „Einfache Parametrisierung“ im Handbuch zur Architektur der Abfrageverarbeitung.
QUERYTRACEON <integer_value>
Mit dieser Option können Sie ein Ablaufverfolgungsflag, das sich auf den Plan auswirkt, nur während der Kompilierung einer einzelnen Abfrage aktivieren. Wie andere Optionen auf Abfrageebene können Sie diese Option zusammen mit Planhinweislisten verwenden, um den Text einer Abfrage, der in einer beliebigen Sitzung ausgeführt wird, abzugleichen, und automatisch ein Ablaufverfolgungsflag anzuwenden, das sich auf den Plan auswirkt, wenn die Abfrage kompiliert wird. Die QUERYTRACEON
Option wird nur für Abfrageoptimierer-Ablaufverfolgungskennzeichnungen unterstützt. Weitere Informationen finden Sie unter Ablaufverfolgungsflags.
Bei Verwendung dieser Option werden keine Fehler oder Warnungen zurückgegeben, wenn eine nicht unterstützte Ablaufverfolgungskennzeichnungsnummer verwendet wird. Wenn das angegebene Ablaufverfolgungsflag keines ist, das sich auf den Ausführungsplan der Abfrage auswirkt, wird die Option einfach ignoriert.
Wenn Sie mehrere Ablaufverfolgungskennzeichnungen in einer Abfrage verwenden möchten, geben Sie einen QUERYTRACEON
Hinweis für jede unterschiedliche Ablaufverfolgungskennzeichnungsnummer an.
RECOMPILE
Weist SQL Server-Datenbank-Engine an, einen neuen, temporären Plan für die Abfrage zu erstellen und diesen Plan sofort nach Ausführung der Abfrage zu verwerfen. Der generierte Abfrageplan ersetzt keinen Plan, der im Cache gespeichert ist, wenn dieselbe Abfrage ohne den RECOMPILE
Hinweis ausgeführt wird. Ohne Angabe RECOMPILE
speichert die Datenbank-Engine Abfragepläne zwischen und verwendet sie wieder. Wenn Abfragepläne kompiliert werden, verwendet der RECOMPILE
Abfragehinweis die aktuellen Werte aller lokalen Variablen in der Abfrage. Wenn sich die Abfrage innerhalb einer gespeicherten Prozedur befindet, werden die aktuellen Werte an beliebige Parameter übergeben.
RECOMPILE
ist eine nützliche Alternative zum Erstellen einer gespeicherten Prozedur. RECOMPILE
verwendet die WITH RECOMPILE
Klausel, wenn nur eine Teilmenge von Abfragen innerhalb der gespeicherten Prozedur anstelle der gesamten gespeicherten Prozedur neu kompiliert werden muss. Weitere Informationen finden Sie unter Erneutes Kompilieren einer gespeicherten Prozedur. RECOMPILE
ist auch hilfreich, wenn Sie Planhandbücher erstellen.
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, wenn die Abfrage verarbeitet wird. Die Zeilen können so groß sein, dass der jeweilige Operator in einigen Fällen die Zeile nicht verarbeiten kann. Wenn Zeilen so groß sind, gibt Datenbank-Engine während der Ausführung der Abfrage einen Fehler aus. Mithilfe von ROBUST PLAN
" weisen Sie den Abfrageoptimierer an, keine Abfragepläne in Betracht zu ziehen, die möglicherweise in diesem Problem auftreten.
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. Datenbank-Engine läßt die Definition von Zeilen zu, deren maximale potenzielle Größe von Datenbank-Engine 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 liegen, die Datenbank-Engine verarbeiten kann. Wenn Datenbank-Engine eine Zeile ermittelt, die zu lang ist, wird ein Ausführungsfehler zurückgegeben.
USE HINT ( 'hint_name' )
Gilt für: SQL Server (ab SQL Server 2016 (13.x) SP1) und Azure SQL-Datenbank.
Stellt einen oder mehrere zusätzliche Hinweise für den Abfrageprozessor bereit. Die zusätzlichen Hinweise werden mit einem Hinweisnamen in einfachen Anführungszeichen angegeben.
Tipp
Bei Hinweisnamen muss die Groß-/Kleinschreibung nicht beachtet werden.
Die folgenden Hinweisnamen werden unterstützt:
Hinweis | Beschreibung |
---|---|
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS' |
Bewirkt, dass SQL Server einen Abfrageplan mithilfe der Annahme der einfachen Eindämmung anstelle der Standardannahme für Basiseinschlusse für Verknüpfungen generiert, unter dem Abfrageoptimierer-Kardinalitätsschätzungsmodell von SQL Server 2014 (12.x) und höheren Versionen. Dieser Hinweisname entspricht ablaufverfolgungskennzeichnung 9476. |
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' |
Bewirkt, dass SQL Server einen Plan mit minimaler Selektivität generiert, wenn AND-Prädikate für Filter geschätzt werden, die bei vollständiger Korrelation berücksichtigt werden sollen. Dieser Hinweisname entspricht ablaufverfolgungskennzeichnung 4137 bei Verwendung mit dem Kardinalitätsschätzungsmodell von SQL Server 2012 (11.x) und früheren Versionen und hat ähnliche Auswirkungen, wenn Trace Flag 9471 mit dem Kardinalitätsschätzungsmodell von SQL Server 2014 (12.x) und höheren Versionen verwendet wird. |
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' |
Bewirkt, dass SQL Server einen Plan mit maximaler Selektivität generiert, wenn AND-Prädikate für Filter geschätzt werden, die bei vollständiger Unabhängigkeit berücksichtigt werden sollen. Dieser Hinweisname ist das Standardverhalten des Kardinalitätsschätzungsmodells von SQL Server 2012 (11.x) und früheren Versionen und entspricht ablaufverfolgungskennzeichnung 9472 bei Verwendung mit dem Kardinalitätsschätzungsmodell von SQL Server 2014 (12.x) und höheren Versionen. Gilt für: Azure SQL-Datenbank |
'ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES' |
Bewirkt, dass SQL Server einen Plan mit maximaler bis minimaler Selektivität generiert, wenn AND-Prädikate für Filter geschätzt werden, die bei einer Teilkorrelation berücksichtigt werden sollen. Dieser Hinweisname ist das Standardverhalten des Kardinalitätsschätzungsmodells von SQL Server 2014 (12.x) und neueren Versionen. Gilt für: Azure SQL-Datenbank |
'DISABLE_BATCH_MODE_ADAPTIVE_JOINS' |
Deaktiviert Adaptive Joins im Batchmodus. Weitere Informationen finden Sie unter Adaptive Joins im Batchmodus. Gilt für: SQL Server 2017 (14.x) und höhere Versionen sowie Azure SQL-Datenbank |
'DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK' |
Deaktiviert das Feedback zur Speicherzuweisung im Batchmodus. Weitere Informationen finden Sie unter Feedback zur Speicherzuweisung im Batchmodus. Gilt für: SQL Server 2017 (14.x) und höhere Versionen sowie Azure SQL-Datenbank |
'DISABLE_DEFERRED_COMPILATION_TV' |
Deaktiviert die verzögerte Kompilierung von Tabellenvariablen. Weitere Informationen finden Sie unter Verzögerte Kompilierung von Tabellenvariablen. Gilt für: SQL Server 2019 (15.x) und höhere Versionen sowie Azure SQL-Datenbank |
'DISABLE_INTERLEAVED_EXECUTION_TVF' |
Deaktiviert die verschachtelte Ausführung mit Tabellenwertfunktionen mit mehreren Anweisungen. Weitere Informationen finden Sie unter Verschachtelte Ausführung mit Tabellenwertfunktionen mit mehreren Anweisungen. Gilt für: SQL Server 2017 (14.x) und höhere Versionen sowie Azure SQL-Datenbank |
'DISABLE_OPTIMIZED_NESTED_LOOP' |
Weist den Abfrageprozessor an, bei der Generierung eines Abfrageplans keine Sortiervorgänge (Batch-Sortierung) für optimierte Joins geschachtelter Schleifen zu verwenden. Dieser Hinweisname entspricht ablaufverfolgungskennzeichnung 2340. Dieser Hinweis gilt auch für explizite Sortierungen und Batchsortierungen. |
'DISABLE_OPTIMIZER_ROWGOAL' |
Veranlasst SQL Server, einen Plan zu erstellen, der keine Zeilenzieländerungen mit Abfragen verwendet, die diese Schlüsselwörter enthalten: - TOP - OPTION (FAST N) - IN - EXISTS Dieser Hinweisname entspricht ablaufverfolgungskennzeichnung 4138. |
'DISABLE_PARAMETER_SNIFFING' |
Weist den Abfrageoptimierer an, die durchschnittliche Datenverteilung zu verwenden, während er eine Abfrage mit einem oder mehreren Parametern kompiliert. Diese Anweisung macht den Abfrageplan unabhängig von dem Parameterwert, der beim Kompilieren der Abfrage zuerst verwendet wurde. Dieser Hinweisname entspricht der Konfigurationseinstellung "Trace Flag 4136" oder "Datenbankbereich"PARAMETER_SNIFFING = OFF . |
'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK' |
Deaktiviert das Feedback zur Speicherzuweisung im Zeilenmodus. Weitere Informationen finden Sie unter Feedback zur Speicherzuweisung im Zeilenmodus. Gilt für: SQL Server 2019 (15.x) und höhere Versionen sowie Azure SQL-Datenbank |
'DISABLE_TSQL_SCALAR_UDF_INLINING' |
Deaktiviert das Inlining benutzerdefinierter Skalarfunktionen. Weitere Informationen finden Sie unter Scalar UDF Inlining (Inlining benutzerdefinierter Skalarfunktionen). Gilt für: SQL Server 2019 (15.x) und höhere Versionen sowie Azure SQL-Datenbank |
'DISALLOW_BATCH_MODE' |
Deaktiviert die Batchmodusausführung. Weitere Informationen finden Sie unter Ausführungsmodi. Gilt für: SQL Server 2019 (15.x) und höhere Versionen sowie Azure SQL-Datenbank |
'ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS' |
Aktiviert automatisch generierte Schnellstatistiken (Histogrammzusatz) für alle führenden Indexspalten, für welche die Kardinalitätsschätzung erforderlich ist. Das Zum Schätzen der Kardinalität verwendete Histogramm wird zur Abfragekompilierungszeit angepasst, um den tatsächlichen Maximal- oder Minimalwert dieser Spalte zu berücksichtigen. Dieser Hinweisname entspricht der Spurkennzeichnung 4139. |
'ENABLE_QUERY_OPTIMIZER_HOTFIXES' |
Aktiviert Hotfixes für den Abfrageoptimierer (Änderungen wurden in kumulativen Updates und Service Packs von SQL Server veröffentlicht). Dieser Hinweisname entspricht der Konfigurationseinstellung "Trace Flag 4199" oder "Datenbankbereich"QUERY_OPTIMIZER_HOTFIXES = ON . |
'FORCE_DEFAULT_CARDINALITY_ESTIMATION' |
Zwingt den Abfrageoptimierer, das Kardinalitätsschätzungsmodell zu verwenden, das dem aktuellen Kompatibilitätsgrad der Datenbank entspricht. Verwenden Sie diesen Hinweis, um die Konfigurationseinstellung LEGACY_CARDINALITY_ESTIMATION = ON der Datenbankbereich oder das Ablaufverfolgungsflaggen 9481 außer Kraft zu setzen. |
'FORCE_LEGACY_CARDINALITY_ESTIMATION' |
Zwingt den Abfrageoptimierer, das Modell Kardinalitätsschätzung von SQL Server 2012 (11.x) und Vorgängerversionen zu verwenden. Dieser Hinweisname entspricht der Konfigurationseinstellung "Trace Flag 9481" oder "Datenbankbereich"LEGACY_CARDINALITY_ESTIMATION = ON . |
'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n' 1 |
Erzwingt das Verhalten des Abfrageoptimierers auf Abfrageebene. Dieses Verhalten tritt auf, wenn die Abfrage mit Datenbank-Kompatibilitätsgrad n kompiliert wird, wobei n ein unterstützter Datenbank-Kompatibilitätsgrad ist. Eine Liste der derzeit unterstützten Werte für n finden Sie unter sys.dm_exec_valid_use_hints. Gilt für: SQL Server 2017 (14.x) CU 10 und höhere Versionen und Azure SQL-Datenbank |
'QUERY_PLAN_PROFILE' 2 |
Aktiviert einfache Profilerstellung für die Abfrage. Wenn eine Abfrage, die diesen neuen Hinweis enthält, query_plan_profile abgeschlossen ist, wird ein neues erweitertes Ereignis ausgelöst. Dieses erweiterte Ereignis macht Ausführungsstatistiken und tatsächliches Ausführungsplan-XML ähnlich wie das query_post_execution_showplan erweiterte Ereignis verfügbar, aber nur für Abfragen, die den neuen Hinweis enthalten.Gilt für: SQL Server 2016 (13.x) SP 2 CU 3, SQL Server 2017 (14.x) CU 11 und höhere Versionen |
1 Der QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n
Hinweis überschreibt die Standardeinstellung oder ältere Kardinalitätsschätzung nicht, wenn Sie sie durch die Konfiguration mit Datenbankbereich, ablaufverfolgungskennzeichnung oder einen anderen Abfragehinweis wie z QUERYTRACEON
. B. erzwingen. Dieser Hinweis betrifft nur das Verhalten des Abfrageoptimierers. Er wirkt sich nicht auf andere Features von SQL Server aus, die möglicherweise vom Datenbank-Kompatibilitätsgrad abhängig sind, wie z.B. die Verfügbarkeit bestimmter Datenbankfeatures. Weitere Informationen finden Sie unter Developer's Choice: Hinting Query Execution model.
2 Wenn Sie das Sammeln des query_post_execution_showplan
erweiterten Ereignisses aktivieren, wird die Standardmäßige Profilerstellungsinfrastruktur jeder Abfrage hinzugefügt, die auf dem Server ausgeführt wird, und kann sich daher auf die gesamte Serverleistung auswirken. Wenn Sie stattdessen die Sammlung des query_thread_profile
erweiterten Ereignisses aktivieren, um eine einfache Profilerstellungsinfrastruktur zu verwenden, führt dies zu einem erheblich geringeren Leistungsaufwand, wirkt sich aber dennoch auf die gesamte Serverleistung aus. Wenn Sie das query_plan_profile
erweiterte Ereignis aktivieren, aktiviert dies nur die einfache Profilerstellungsinfrastruktur für eine Abfrage, die mit den query_plan_profile
ausgeführten und daher keine Auswirkungen auf andere Workloads auf dem Server hat. Verwenden Sie diesen Hinweis, um ein Profil für eine bestimmte Abfrage zu erstellen, ohne dabei andere Teile der Serverworkload zu beeinträchtigen. Weitere Informationen zur einfachen Profilerstellung finden Sie unter Query Profiling Infrastructure.
Die Liste aller unterstützten USE HINT
Namen kann mithilfe der dynamischen Verwaltungsansicht sys.dm_exec_valid_use_hints abgefragt werden.
Wichtig
Einige USE HINT
Hinweise stehen möglicherweise in Konflikt mit Ablaufverfolgungskennzeichnungen, die auf globaler oder Sitzungsebene aktiviert sind, oder konfigurationseinstellungen mit Datenbankbereich. In diesem Fall hat der Hinweis auf Abfrageebene (USE HINT
) immer Vorrang. Wenn ein Konflikt mit einem USE HINT
anderen Abfragehinweis auftritt oder ein Ablaufverfolgungskennzeichnung auf Abfrageebene (z. B. von QUERYTRACEON
) aktiviert ist, generiert SQL Server beim Ausführen der Abfrage einen Fehler.
USE PLAN N'xml_plan'
Erzwingt den Abfrageoptimierer, einen vorhandenen Abfrageplan für eine abfrage zu verwenden, die durch xml_plan angegeben wurde. USE PLAN
kann nicht mit INSERT
, , UPDATE
oder MERGE
DELETE
Anweisungen angegeben werden.
Der resultierende Ausführungsplan, der von diesem Feature erzwungen wird, ist identisch oder ähnlich wie der Plan, der erzwungen wird. Da der resultierende Plan möglicherweise nicht mit dem durch USE PLAN
den angegebenen Plan identisch ist, kann die Leistung der Pläne variieren. In seltenen Fällen kann der Leistungsunterschied erheblich und negativ sein. In diesem Fall muss der Administrator den erzwungenen Plan entfernen.
TABLE HINT ( exposed_object_name [ , <table_hint> [ , ] ... n ] ] )
Wendet den angegebenen Tabellenhinweis auf die Tabelle oder Sicht an, die exposed_object_name entspricht. Es wird empfohlen, einen Tabellenhinweis nur im Kontext einer Planhinweisliste als Abfragehinweis zu verwenden.
exposed_object_name kann einer der folgenden Verweise sein:
Wenn für die Tabelle oder die Ansicht in der FROM-Klausel der Abfrage ein Alias verwendet wird, ist exposed_object_name der Alias.
Wenn kein Alias verwendet wird, ist exposed_object_name die genaue Übereinstimmung der Tabelle oder Ansicht, auf die in der
FROM
Klausel verwiesen wird. Wenn z.B. mit einem zweiteiligen Namen auf die Tabelle oder die Ansicht verwiesen wird, ist exposed_object_name der gleiche zweiteilige Name.
Wenn Sie exposed_object_name angeben, ohne auch einen Tabellenhinweis anzugeben, werden alle Indizes, die Sie in der Abfrage als Teil eines Tabellenhinweises für das Objekt angeben, nicht berücksichtigt. Die Abfrageoptimierer bestimmt dann, wie der Index zu verwenden ist. Sie können diese Technik verwenden, um den Effekt eines INDEX
Tabellenhinweiss zu beseitigen, wenn Sie die ursprüngliche Abfrage nicht ändern können. Siehe Beispiel J.
<table_hint>
NOEXPAND [ , INDEX ( index_value [ ,... n ] ) | INDEX = ( index_value ) ] | INDEX ( index_value [ ,... n ] ) | INDEX = ( index_value ) | FORCESEEK [ ( index_value ( index_column_name [,... ] ) ] | FORCESCAN | HOLDLOCK | NOLOCK | NOWAIT | PAGLOCK | READCOMMITTED | READCOMMITTEDLOCK | READPAST | READUNCOMMITTED | WIEDERHOLBARES GELESEN | ROWLOCK | SERIALIZIERBAR | MOMENTAUFNAHME | SPATIAL_WINDOW_MAX_CELLS = integer_value | TABLOCK | TABLOCKX | UPDLOCK | XLOCK
Der Tabellenhinweis, der auf die Tabelle oder Ansicht angewendet werden soll, die exposed_object_name als Abfragehinweis entspricht. Eine Beschreibung dieser Hinweise finden Sie unter "Tabellenhinweise".
Tabellenhinweise außer INDEX
, FORCESCAN
und FORCESEEK
sind als Abfragehinweise unzulässig, es sei denn, die Abfrage verfügt bereits über eine WITH
Klausel, die den Tabellenhinweis angibt. Weitere Informationen finden Sie im Abschnitt Bemerkungen.
Achtung
Die Angabe FORCESEEK
mit Parametern beschränkt die Anzahl der Pläne, die vom Abfrageoptimierer mehr berücksichtigt werden können, als wenn sie ohne Parameter angegeben FORCESEEK
werden. Dies kann in mehreren Fällen zu dem Fehler führen, dass der Plan nicht generiert werden kann.
FOR TIMESTAMP AS OF 'point_in_time'
Gilt für: Warehouse in Microsoft Fabric
Verwenden Sie die TIMESTAMP
Syntax in der OPTION
Klausel, um Daten abzufragen, wie sie in der Vergangenheit vorhanden waren (Teil des Zeitreisefeatures in Synapse Data Warehouse in Microsoft Fabric).
Geben Sie den point_in_time im Format yyyy-MM-ddTHH:mm:ss[.fff]
an, um Daten zurückzugeben, wie sie zum entsprechenden Zeitpunkt angezeigt wurden. Die Zeitzone wird immer in UTC angegeben. Verwenden Sie die CONVERT
Syntax für das erforderliche Datetime-Format mit style 126.
Der TIMESTAMP AS OF
Hinweis kann mit der OPTION
Klausel nur einmal angegeben werden. Weitere Informationen und Einschränkungen finden Sie unter Daten abfragen, wie sie in der Vergangenheit vorhanden waren.
Hinweise
Abfragehinweise können nicht in einer INSERT
Anweisung angegeben werden, außer wenn eine SELECT
Klausel innerhalb der Anweisung verwendet wird.
Abfragehinweise können nur in der Abfrage der obersten Ebene angegeben werden, nicht in Unterabfragen. Wenn ein Tabellenhinweis als Abfragehinweis angegeben wird, kann der Hinweis in der Abfrage der obersten Ebene oder in einer Unterabfrage angegeben werden. Der für exposed_object_name in der TABLE HINT
Klausel angegebene Wert muss jedoch exakt mit dem verfügbar gemachten Namen in der Abfrage oder Unterabfrage übereinstimmen.
Angeben von Tabellenhinweisen als Abfragehinweise
Wir empfehlen die Verwendung des INDEX
Hinweiss oder FORCESEEK
FORCESCAN
der Tabelle als Abfragehinweis nur im Kontext eines Planleitfadens. Planhinweislisten sind nützlich, wenn Sie die ursprüngliche Abfrage nicht ändern können, beispielsweise bei Anwendungen von Drittanbietern. Der im Planleitfaden angegebene Abfragehinweis wird der Abfrage hinzugefügt, bevor sie kompiliert und optimiert wird. Verwenden Sie für Ad-hoc-Abfragen die TABLE HINT
Klausel nur, wenn Anweisungen zum Testplanleitfaden getestet werden. Es wird empfohlen, für alle anderen Ad-hoc-Abfragen diese Hinweise nur als Tabellenhinweise anzugeben.
Wenn als Abfragehinweis angegeben, sind die INDEX
Hinweise FORCESCAN
und FORCESEEK
Tabellenhinweise für die folgenden Objekte gültig:
- Tabellen
- Sichten
- Indizierte Sichten
- Allgemeine Tabellenausdrücke (der Hinweis muss in der
SELECT
Anweisung angegeben werden, deren Resultset den allgemeinen Tabellenausdruck auffüllt) - Dynamische Verwaltungssichten (DMVs)
- Benannte Unterabfragen
Sie können Hinweise und FORCESEEK
Tabellenhinweise als Abfragehinweise für eine Abfrage angebenINDEX
FORCESCAN
, für die keine Tabellenhinweise vorhanden sind. Sie können sie auch verwenden, um vorhandene INDEX
, FORCESCAN
oder FORCESEEK
Hinweise in der Abfrage zu ersetzen.
Tabellenhinweise außer INDEX
, FORCESCAN
und FORCESEEK
sind als Abfragehinweise unzulässig, es sei denn, die Abfrage verfügt bereits über eine WITH
Klausel, die den Tabellenhinweis angibt. In diesem Fall muss auch ein übereinstimmender Hinweis als Abfragehinweis angegeben werden. Geben Sie den übereinstimmenden Hinweis als Abfragehinweis an, indem Sie in der OPTION
Klausel verwendenTABLE HINT
. Diese Spezifikation behält die Semantik der Abfrage bei. Wenn die Abfrage z. B. den Tabellenhinweis NOLOCK
enthält, muss die OPTION
Klausel im @hints Parameter des Planleitfadens auch den NOLOCK
Hinweis enthalten. Siehe Beispiel K.
Angeben von Hinweisen mit Abfragespeicherhinweisen
Sie können Hinweise zu Abfragen erzwingen, die über den Abfragespeicher identifiziert wurden, ohne Codeänderungen vorzunehmen, indem Sie das Feature Abfragespeicherhinweise verwenden. Verwenden Sie die gespeicherte Prozedur sys.sp_query_store_set_hints, um einen Hinweis auf eine Abfrage anzuwenden. Siehe Beispiel N.
Beispiele
A. Verwenden von MERGE JOIN
Im folgenden Beispiel wird angegeben, dass MERGE JOIN
der JOIN
Vorgang in der Abfrage ausgeführt wird. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
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, für @city_name
den Wert 'Seattle'
und für @postal_code
die durchschnittliche Selektivität des Prädikats für alle Spaltenwerte zu verwenden, wenn die Abfrage optimiert wird. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
CREATE PROCEDURE dbo.RetrievePersonAddress
@city_name NVARCHAR(30),
@postal_code NVARCHAR(15)
AS
SELECT * FROM Person.Address
WHERE City = @city_name AND PostalCode = @postal_code
OPTION ( OPTIMIZE FOR (@city_name = 'Seattle', @postal_code UNKNOWN) );
GO
C. Verwenden von MAXRECURSION
MAXRECURSION
kann verwendet werden, um zu verhindern, dass ein schlecht gebildeter rekursiver allgemeiner Tabellenausdruck in eine Endlosschleife eintritt. Im folgenden Beispiel wird absichtlich eine Endlosschleife erstellt. Außerdem wird MAXRECURSION
verwendet, um die Anzahl der Rekursionsebenen auf zwei zu beschränken. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
--Creates an infinite loop
WITH cte (CustomerID, PersonID, StoreID) AS
(
SELECT CustomerID, PersonID, StoreID
FROM Sales.Customer
WHERE PersonID IS NOT NULL
UNION ALL
SELECT cte.CustomerID, cte.PersonID, cte.StoreID
FROM cte
JOIN Sales.Customer AS e
ON cte.PersonID = e.CustomerID
)
--Uses MAXRECURSION to limit the recursive levels to 2
SELECT CustomerID, PersonID, StoreID
FROM cte
OPTION (MAXRECURSION 2);
GO
Nachdem der Codierungsfehler behoben wurde, MAXRECURSION
ist nicht mehr erforderlich.
D: Verwenden von MERGE UNION
Im folgenden Beispiel wird der MERGE UNION
-Abfragehinweis verwendet. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
SELECT *
FROM HumanResources.Employee AS e1
UNION
SELECT *
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO
E. Verwenden von HASH GROUP und FAST
Im folgenden Beispiel werden die HASH GROUP
Hinweise und FAST
Abfragehinweise verwendet. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
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. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
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
G. Verwenden von INDEX
In den folgenden Beispielen wird der INDEX
Hinweis verwendet. Im ersten Beispiel wird ein einzelner Index angegeben. Im zweiten Beispiel werden mehrere Indizes für einen einzelnen Tabellenverweis angegeben. Da Sie in beiden Beispielen den INDEX
Hinweis auf eine Tabelle anwenden, die einen Alias verwendet, muss die TABLE HINT
Klausel auch denselben Alias wie der Name des verfügbar gemachten Objekts angeben. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
EXEC sp_create_plan_guide
@name = N'Guide1',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e, INDEX (IX_Employee_ManagerID)))';
GO
EXEC sp_create_plan_guide
@name = N'Guide2',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e, INDEX(PK_Employee_EmployeeID, IX_Employee_ManagerID)))';
GO
H. Verwenden von FORCEEEK
Im folgenden Beispiel wird der FORCESEEK
Tabellenhinweis verwendet. Die TABLE HINT
Klausel muss auch denselben zweiteiligen Namen wie der exponierte Objektname angeben. Geben Sie den Namen an, wenn Sie den INDEX
Hinweis auf eine Tabelle anwenden, die einen zweiteiligen Namen verwendet. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
EXEC sp_create_plan_guide
@name = N'Guide3',
@stmt = N'SELECT c.LastName, c.FirstName, HumanResources.Employee.Title
FROM HumanResources.Employee
JOIN Person.Contact AS c ON HumanResources.Employee.ContactID = c.ContactID
WHERE HumanResources.Employee.ManagerID = 3
ORDER BY c.LastName, c.FirstName;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT( HumanResources.Employee, FORCESEEK))';
GO
I. Verwenden von mehreren Tabellenhinweisen
Im folgenden Beispiel wird der INDEX
Hinweis auf eine Tabelle und den FORCESEEK
Hinweis auf eine andere angewendet. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
EXEC sp_create_plan_guide
@name = N'Guide4',
@stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT (e, INDEX( IX_Employee_ManagerID))
, TABLE HINT (c, FORCESEEK))';
GO
J. Verwenden von TABLE HINT zum Überschreiben eines vorhandenen Tabellenhinweises
Das folgende Beispiel zeigt, wie Sie den TABLE HINT
Hinweis verwenden. Sie können den Hinweis verwenden, ohne einen Hinweis anzugeben, um das Verhalten des Tabellenhinweiss, das INDEX
Sie in der FROM
Klausel der Abfrage angeben, außer Kraft zu setzen. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
EXEC sp_create_plan_guide
@name = N'Guide5',
@stmt = N'SELECT e.ManagerID, c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e WITH (INDEX (IX_Employee_ManagerID))
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT(e))';
GO
K. Angeben von Tabellenhinweisen, die die Semantik beeinflussen
Das folgende Beispiel enthält zwei Tabellenhinweise in der Abfrage: NOLOCK
, die semantische Auswirkungen haben und INDEX
die nicht semantisch beeinflussen. Um die Semantik der Abfrage beizubehalten, wird der NOLOCK
Hinweis in der OPTIONS
Klausel des Planleitfadens angegeben. Geben Sie zusammen mit dem NOLOCK
Hinweis die INDEX
Hinweise an FORCESEEK
, und ersetzen Sie den nicht semantischen Hinweis INDEX
in der Abfrage während der Anweisungskompilierung und Optimierung. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
EXEC sp_create_plan_guide
@name = N'Guide6',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 3;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT (e, INDEX(IX_Employee_ManagerID), NOLOCK, FORCESEEK))';
GO
Das folgende Beispiel zeigt eine alternative Methode, um die Semantik der Abfrage beizubehalten und zuzulassen, dass der Abfrageoptimierer einen anderen als den im Tabellenhinweis angegebenen Index verwendet. Erlauben Sie dem Optimierer die Auswahl, indem Sie den NOLOCK
Hinweis in der OPTIONS
Klausel angeben. Sie geben den Hinweis an, da er die Semantik beeinflusst. Geben Sie dann das TABLE HINT
Schlüsselwort nur mit einem Tabellenverweis und keine INDEX
Hinweise an. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
EXEC sp_create_plan_guide
@name = N'Guide7',
@stmt = N'SELECT c.LastName, c.FirstName, e.Title
FROM HumanResources.Employee AS e
WITH (NOLOCK, INDEX (PK_Employee_EmployeeID))
JOIN Person.Contact AS c ON e.ContactID = c.ContactID
WHERE e.ManagerID = 2;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (TABLE HINT (e, NOLOCK))';
GO
L. Verwenden von USE HINT
Im folgenden Beispiel werden die RECOMPILE
Hinweise und USE HINT
Abfragehinweise verwendet. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet.
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (RECOMPILE, USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES', 'DISABLE_PARAMETER_SNIFFING'));
GO
M. Verwenden von QUERYTRACEON HINT
Im folgenden Beispiel werden die QUERYTRACEON
Abfragehinweise verwendet. Im Beispiel wird die AdventureWorks2022
-Datenbank verwendet. Sie können mithilfe der folgenden Abfrage alle den Plan beeinflussenden Hotfixes aktivieren, die vom Ablaufverfolgungsflag 4199 für eine bestimmte Abfrage gesteuert werden:
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199);
Wie in der folgenden Abfrage können Sie auch mehrere Ablaufverfolgungsflags verwenden:
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199, QUERYTRACEON 4137);
N. Verwenden von Abfragespeicherhinweisen
Mit dem Feature Abfragespeicherhinweise in Azure SQL-Datenbank können Sie Abfragepläne auf einfache Weise strukturieren, ohne den Anwendungscode ändern zu müssen.
Identifizieren Sie zunächst die Abfrage, die bereits in den Abfragespeicher-Katalogsichten ausgeführt wurde. Beispiel:
SELECT q.query_id, qt.query_sql_text
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q ON
qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%ORDER BY ListingPrice DESC%'
AND query_sql_text not like N'%query_store%';
GO
Im folgenden Beispiel wird der Hinweis angewendet, um die Legacykardinalitätsschätzung für query_id 39 zu erzwingen, identifiziert im Abfragespeicher:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
Im folgenden Beispiel wird der Hinweis angewendet, um eine maximale Speicherzuteilungsgröße in PERCENT
der konfigurierten Speichergrenze auf query_id
39 zu erzwingen, die in Abfragespeicher identifiziert wird:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(MAX_GRANT_PERCENT=10)';
Im folgenden Beispiel werden mehrere Abfragehinweise auf query_id 39 angewendet, einschließlich RECOMPILE
, MAXDOP 1
und das SQL Server 2012 (11.x)-Abfrageoptimiererverhalten:
EXEC sys.sp_query_store_set_hints @query_id= 39,
@query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';
O. Abfragen von Daten zu einem bestimmten Zeitpunkt
Gilt für: Warehouse in Microsoft Fabric
Verwenden Sie die TIMESTAMP
Syntax in der OPTION
Klausel, um Daten abzufragen, wie sie in der Vergangenheit in Synapse Data Warehouse in Microsoft Fabric vorhanden waren. Die folgende Beispielabfrage gibt Daten zurück, wie sie am 13. März 2024 um 19:39:35.28 Uhr UTC existierten. Die Zeitzone wird immer in UTC angegeben.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey
OPTION (FOR TIMESTAMP AS OF '2024-03-13T19:39:35.28');--March 13, 2024 at 7:39:35.28 PM UTC