Abfragehinweise (Transact-SQL)
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL verwaltete Instanz SQL Analytics-Endpunkt in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL-Datenbank in Microsoft Fabric SQL in Microsoft Fabric
Abfragehinweise geben an, dass die angegebenen Hinweise 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-Klauselangegeben. Fehler 8622 tritt auf, wenn ein oder mehrere Abfragehinweise dazu führen, dass der Abfrageoptimierer keinen gültigen Plan generiert.
Vorsicht
Da der SQL Server-Abfrageoptimierer in der Regel den besten Ausführungsplan für eine Abfrage auswählt, empfehlen wir, nur Hinweise als letztes Mittel für erfahrene Entwickler und Datenbankadministratoren zu verwenden.
Gilt für:
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 } GRUPPE
Gibt an, dass Aggregationen, die die GROUP BY
oder DISTINCT
Klausel der Abfrage beschreiben, Hashing oder Sortierung verwenden sollen.
- Im Allgemeinen kann ein hashbasierter Algorithmus die Leistung von Abfragen verbessern, die große oder komplexe Gruppierungssätze umfassen.
- Im Allgemeinen kann ein sortbasierter Algorithmus die Leistung von Abfragen verbessern, die kleine oder einfache Gruppierungssätze umfassen.
{ MERGE | HASH | VERKETTEN } UNION
Gibt an, dass alle UNION
Vorgänge ausgeführt werden, indem UNION
Sätze zusammengeführt, hashing oder verkettet werden. Wenn mehr als ein UNION
Hinweis angegeben ist, wählt der Abfrageoptimierer die am wenigsten teure Strategie aus den angegebenen Hinweisen aus.
- Im Allgemeinen kann ein zusammenführenbasierter Algorithmusvorgang die Leistung von Abfragen verbessern, die sortierte Eingaben umfassen.
- Im Allgemeinen kann ein hashbasierter Algorithmus die Leistung von Abfragen verbessern, die unsortierte oder große Eingaben umfassen.
- Im Allgemeinen kann ein verkettungsbasierter Algorithmus die Leistung von Abfragen verbessern, die unterschiedliche oder kleine Eingaben umfassen.
{ LOOP | ZUSAMMENFÜHREN | 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 mehrere Verknüpfungshinweise angeben, wählt der Optimierer die am wenigsten teure Verknüpfungsstrategie aus den zulässigen aus.
Wenn Sie einen Verknüpfungshinweis in der FROM
Klausel derselben Abfrage für ein bestimmtes Tabellenpaar angeben, hat dieser Verknüpfungshinweis Vorrang beim Verknüpfen der beiden Tabellen. Die Abfragehinweise müssen jedoch weiterhin berücksichtigt werden. Der Verknüpfungshinweis für das Tabellenpaar beschränkt möglicherweise nur die Auswahl zulässiger Verknüpfungsmethoden im Abfragehinweis. Weitere Informationen finden Sie unter Verknüpfungshinweise.
DISABLE_OPTIMIZED_PLAN_FORCING
Gilt für: SQL Server (ab SQL Server 2022 (16.x))
Deaktiviert optimierten Plan, der für eine Abfrage erzwingt.
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.
ANSICHTEN ERWEITERN
Gibt an, dass die indizierten Ansichten erweitert werden. Gibt auch an, dass der Abfrageoptimierer keine indizierte Ansicht als Ersatz für alle Abfrageparts betrachtet. Eine Ansicht wird erweitert, wenn die Ansichtsdefinition den Ansichtsnamen im Abfragetext ersetzt.
Diese Abfrage weist die direkte Verwendung von indizierten Ansichten und Indizes für indizierte Ansichten im Abfrageplan praktisch nicht zu.
Hinweis
Die indizierte Ansicht bleibt kondensiert, wenn ein direkter Verweis auf die Ansicht im SELECT
Teil der Abfrage 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 Using NOEXPAND.
Der Hinweis betrifft nur die Ansichten im SELECT
Teil der Anweisungen, einschließlich der Ansichten in INSERT
, UPDATE
, MERGE
und DELETE
Anweisungen.
FAST integer_value
Gibt an, dass die Abfrage für den schnellen Abruf der ersten integer_value Anzahl von Zeilen optimiert ist. Dieses Ergebnis ist eine nicht negative ganze Zahl. Nachdem die erste integer_value Anzahl von Zeilen zurückgegeben wurde, setzt die Abfrage die Ausführung fort und erzeugt den vollständigen Resultset.
ERZWINGUNGSREIHENFOLGE
Gibt an, dass die durch die Abfragesyntax angegebene Verknüpfungsreihenfolge während der Abfrageoptimierung beibehalten wird. Die Verwendung von FORCE ORDER
wirkt sich nicht auf das mögliche Rollenumkehrverhalten des Abfrageoptimierers aus.
FORCE ORDER
behält die in der Abfrage angegebene Verknüpfungsreihenfolge bei, wodurch die Leistung oder Konsistenz von Abfragen verbessert werden kann, die komplexe Verknüpfungsbedingungen oder Hinweise umfassen.
Hinweis
In einer MERGE
-Anweisung wird auf die Quelltabelle vor der Zieltabelle als Standardbeitrittsreihenfolge zugegriffen, es sei denn, die WHEN SOURCE NOT MATCHED
-Klausel ist angegeben. Wenn Sie FORCE ORDER
angeben, bleibt dieses Standardverhalten erhalten.
{ FORCE | DISABLE } EXTERNALPUSHDOWN
Erzwingen oder Deaktivieren des Pushdowns der Berechnung von qualifizierenden Ausdrücken in Hadoop. Gilt nur für Abfragen mit PolyBase. Verschiebt sich nicht auf Azure Storage.
{ FORCE | DISABLE } SCALEOUTEXECUTION
Erzwingen oder Deaktivieren der Skalierungsausführung von PolyBase-Abfragen, die externe Tabellen in SQL Server 2019 Big Data Clusterverwenden. Dieser Hinweis wird nur von einer Abfrage mit der Masterinstanz eines SQL Big Data-Clusters berücksichtigt. Die Skalierung erfolgt über den Computepool des Big Data-Clusters.
PLAN BEIBEHALTEN
Ä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
Wenn Sie KEEP PLAN
angeben, wird sichergestellt, dass eine Abfrage nicht so häufig kompiliert wird, wenn eine Tabelle mehrere Aktualisierungen enthält.
KEEPFIXED PLAN
Erzwingt, dass der Abfrageoptimierer eine Abfrage aufgrund von Änderungen in Statistiken nicht erneut kompiliert. Wenn sie KEEPFIXED PLAN
angeben, wird sichergestellt, dass eine Abfrage nur dann neu kompiliert wird, wenn sich das Schema der zugrunde liegenden Tabellen ändert oder wenn sp_recompile
für diese Tabellen ausgeführt wird.
IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
Gilt für: SQL Server (beginnend mit SQL Server 2012 (11.x)).
Verhindert, dass die Abfrage einen nicht gruppierten speicheroptimierten Spaltenspeicherindex verwendet. Wenn die Abfrage den Abfragehinweis enthält, um die Verwendung des Spaltenspeicherindexes und einen Indexhinweis zur Verwendung eines Columnstore-Index zu vermeiden, stehen die Hinweise in Konflikt, und die Abfrage gibt einen Fehler zurück.
MAX_GRANT_PERCENT = <numeric_value>
Gilt für: SQL Server (beginnend mit 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 Speichererteilung in PERCENT
des konfigurierten Speicherlimits. Die Abfrage wird garantiert nicht überschreiten, wenn die Abfrage in einem benutzerdefinierten Ressourcenpool ausgeführt wird. Wenn die Abfrage in diesem Fall nicht über den mindestens erforderlichen Arbeitsspeicher verfügt, löst das System einen Fehler aus. Wenn eine Abfrage im Systempool ausgeführt wird (Standard), erhält sie mindestens den zum Ausführen erforderlichen Arbeitsspeicher. Der tatsächliche Grenzwert kann niedriger sein, wenn die Einstellung "Ressourcenkontrolle" niedriger als der durch diesen Hinweis angegebene Wert ist. Gültige Werte liegen 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 (beginnend mit SQL Server 2012 (11.x) Service Pack 3, SQL Server 2014 (12.x) Service Pack 2 und Azure SQL-Datenbank.
Die Mindestgröße der Speicherzuteilung in PERCENT
des konfigurierten Speicherlimits. Die Abfrage wird garantiert MAX(required memory, min grant)
, da mindestens erforderlicher Arbeitsspeicher zum Starten einer Abfrage benötigt wird. Gültige Werte liegen zwischen 0,0 und 100,0.
Die Option min_grant_percent Speichererteilung setzt unabhängig von der Größe die option sp_configure
(Mindestspeicher pro Abfrage (KB)) außer Kraft. Der Hinweis zur Speichererteilung ist für die Indexerstellung oder die Indexerstellung nicht verfügbar.
MAXDOP-<integer_value>
gilt für: SQL Server (beginnend mit SQL Server 2008 (10.0.x)) und Azure SQL-Datenbank.
Überschreibt den maximalen Grad an Parallelität Konfigurationsoption von sp_configure
. Überschreibt auch den Ressourcengouverneur für die Abfrage, die diese Option angibt. Der MAXDOP
Abfragehinweis kann den mit sp_configure
konfigurierten Wert überschreiten. Wenn MAXDOP
den mit Ressourcenhauptwert konfigurierten Wert überschreitet, verwendet das Datenbankmodul den Wert "Resource Governor" MAXDOP
, der in ALTER WORKLOAD GROUPbeschrieben wird. Alle semantischen Regeln, die mit dem maximalen Grad an Parallelität verwendet werden, Konfigurationsoption gelten, wenn Sie den MAXDOP
Abfragehinweis verwenden. Weitere Informationen finden Sie unter Konfigurieren des maximalen Grads der Serverkonfigurationsoption.
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 von Rekursionen an, die für diese Abfrage zulässig sind. Zahl ist eine positive ganze Zahl zwischen 0 und 32.767. Wenn 0 angegeben ist, wird kein Grenzwert angewendet. Wenn diese Option nicht angegeben ist, beträgt der Standardgrenzwert für den Server 100.
Wenn die angegebene oder Standardnummer für MAXRECURSION
Grenzwert während der Abfrageausführung erreicht wird, endet die Abfrage und ein Fehler wird zurückgegeben.
Aufgrund dieses Fehlers werden alle Auswirkungen der Anweisung zurückgesetzt. Wenn es sich bei der Anweisung um eine SELECT
-Anweisung handelt, werden möglicherweise Teilergebnisse oder keine Ergebnisse zurückgegeben. Alle zurückgegebenen Teilergebnisse enthalten möglicherweise nicht alle Zeilen auf Rekursionsebenen, die über die angegebene maximale Rekursionsebene hinausgehen.
Weitere Informationen finden Sie unter WITH common_table_expression.
NO_PERFORMANCE_SPOOL
gilt für: SQL Server (beginnend mit SQL Server 2016 (13.x)) und Azure SQL-Datenbank.
Verhindert, dass ein Spool-Operator abfrageplänen hinzugefügt wird (mit Ausnahme der Pläne, wenn Spool erforderlich ist, um gültige Updatesemantik zu garantieren). Der Spooloperator kann die Leistung in einigen Szenarien verringern. Beispielsweise verwendet der Spool tempdb
, und tempdb
Inhalt kann auftreten, wenn viele gleichzeitige Abfragen mit den Spoolvorgängen ausgeführt werden.
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 statistische Daten anstelle des Anfangswerts verwendet, um den Wert für eine lokale Variable während der Abfrageoptimierung zu ermitteln.
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 und nicht als Wert von @variable_name während der Abfrageausführung verwendet. literal_constant kann ein beliebiger SQL Server-Systemdatentyp sein, der als Literalkonstante ausgedrückt werden kann. Der Datentyp der literal_constant muss implizit in den Datentyp konvertierbar sein, der Verweise in der Abfrage @variable_name.
OPTIMIZE FOR kann dem Standardverhalten der Parametererkennung des Optimierers entgegenwirken. Verwenden Sie auch OPTIMIZE FOR
beim Erstellen von Planhandbüchern. Weitere Informationen finden Sie unter Erneutes Kompilieren einer gespeicherten Prozedur.
OPTIMIEREN FÜR UNBEKANNT
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 Sie OPTIMIZE FOR @variable_name = <literal_constant>
und OPTIMIZE FOR UNKNOWN
in demselben Abfragehinweis verwenden, verwendet der Abfrageoptimierer die für einen bestimmten Wert angegebene literal_constant. Der Abfrageoptimierer verwendet UNKNOWN für die restlichen Variablenwerte. Die Werte werden nur während der Abfrageoptimierung und nicht während der Abfrageausführung verwendet.
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
Datenbank SET
Option außer Kraft zu setzen. Sie kann nicht direkt in einer Abfrage angegeben werden.
Weitere Informationen finden Sie unter Angeben des Abfrageparameterverhaltens mithilfe von Planführungslinien.
SIMPLE
weist den Abfrageoptimierer an, eine einfache Parametrierung zu versuchen.
FORCED
weist den Abfrageoptimierer an, die erzwungene Parametrisierung zu versuchen. Weitere Informationen finden Sie unter erzwungenen Parametrisierung im Leitfaden zur Abfrageverarbeitungsarchitekturund einfache Parametrisierung imder Abfrageverarbeitungsarchitektur.
QUERYTRACEON-<integer_value>
Mit dieser Option können Sie ein planbezogenes Ablaufverfolgungskennzeichnung nur während der Kompilierung mit einer Abfrage aktivieren. Wie andere Optionen auf Abfrageebene können Sie sie zusammen mit Planführungslinien verwenden, um den Text einer Abfrage abzugleichen, die von einer beliebigen Sitzung ausgeführt wird, und automatisch ein Plan-bedingtes Ablaufverfolgungskennzeichnung anwenden, wenn diese Abfrage kompiliert wird. Die option QUERYTRACEON
wird nur für Abfrageoptimierer-Ablaufverfolgungskennzeichnungen unterstützt. Weitere Informationen finden Sie unter Ablaufverfolgungskennzeichnungen.
Bei Verwendung dieser Option werden keine Fehler oder Warnungen zurückgegeben, wenn eine nicht unterstützte Ablaufverfolgungskennzeichnungsnummer verwendet wird. Wenn das angegebene Ablaufverfolgungskennzeichnung nicht einer ist, der sich auf einen Abfrageausführungsplan auswirkt, wird die Option automatisch ignoriert.
Wenn Sie in einer Abfrage mehrere Ablaufverfolgungskennzeichnungen verwenden möchten, geben Sie einen QUERYTRACEON
Hinweis für jede unterschiedliche Ablaufverfolgungskennzeichnungsnummer an.
NEU ÜBERSETZEN
Weist das SQL Server-Datenbankmodul an, einen neuen, temporären Plan für die Abfrage zu generieren und diesen Plan sofort zu verwerfen, nachdem die Abfrage die Ausführung abgeschlossen hat. Der generierte Abfrageplan ersetzt keinen Im Cache gespeicherten Plan, wenn dieselbe Abfrage ohne den hinweis RECOMPILE
ausgeführt wird. Ohne angabe von RECOMPILE
speichert das Datenbankmodul 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 in einer gespeicherten Prozedur befindet, werden die aktuellen Werte an 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.
ROBUSTER PLAN
Erzwingt den Abfrageoptimierer, einen Plan zu testen, der für die maximale potenzielle Zeilengröße funktioniert, möglicherweise auf Kosten der Leistung. Wenn die Abfrage verarbeitet wird, müssen Zwischentabellen und Operatoren möglicherweise Zeilen speichern und verarbeiten, die breiter als eine der Eingabezeilen sind, wenn die Abfrage verarbeitet wird. Die Zeilen sind möglicherweise so breit, dass der jeweilige Operator die Zeile manchmal nicht verarbeiten kann. Wenn Zeilen so breit sind, erzeugt das Datenbankmodul während der Abfrageausführung einen Fehler. Mithilfe von ROBUST PLAN
weisen Sie den Abfrageoptimierer an, keine Abfragepläne zu berücksichtigen, die möglicherweise in diesem Problem auftreten.
Wenn ein solcher Plan nicht möglich ist, gibt der Abfrageoptimierer einen Fehler zurück, anstatt die Fehlererkennung auf die Abfrageausführung zurückzustellen. Zeilen können Spalten mit variabler Länge enthalten; Mit dem Datenbankmodul können Zeilen definiert werden, die eine maximale potenzielle Größe aufweisen, die über die Fähigkeit des Datenbankmoduls hinausgeht, sie zu verarbeiten. Im Allgemeinen speichert eine Anwendung trotz der maximalen potenziellen Größe Zeilen mit tatsächlichen Größen innerhalb der Grenzwerte, die das Datenbankmodul verarbeiten kann. Wenn das Datenbankmodul eine Zeile übergibt, die zu lang ist, wird ein Ausführungsfehler zurückgegeben.
USE HINT ( 'hint_name' )
Gilt für: SQL Server (beginnend mit 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ührungszeichenangegeben.
Tipp
Hinweisnamen werden ohne Groß-/Kleinschreibung unterschieden.
Die folgenden Hinweisnamen werden unterstützt:
Hinweis | BESCHREIBUNG |
---|---|
'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'
|
Generiert einen Abfrageplan unter Verwendung der Annahme für einfache Eindämmung anstelle der Standardmäßigen Basiseinschlussannahme für Verknüpfungen unter dem Abfrageoptimierer Kardinalitätsschätzung Modell von SQL Server 2014 (12.x) und höheren Versionen. Dieser Hinweisname entspricht Ablaufverfolgungskennzeichnung 9476. |
'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES'
|
Generiert einen Plan mit minimaler Selektivität beim Schätzen und Prädikaten für Filter, um die vollständige Korrelation zu berücksichtigen. 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 Ablaufverfolgungskennzeichnung 9471 mit dem Kardinalitätsschätzungsmodell von SQL Server 2014 (12.x) und höheren Versionen verwendet wird. |
'ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES' |
Generiert einen Plan unter Verwendung der maximalen Selektorivität beim Schätzen und Prädikaten für Filter, um die volle Unabhängigkeit zu berücksichtigen. 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' |
Generiert einen Plan unter Verwendung der meisten bis zur geringsten Selektorivität bei der Schätzung UND Prädikate für Filter, um die teilweise Korrelation zu berücksichtigen. 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 Verknüpfungen im Batchmodus. Weitere Informationen finden Sie unter batchmodus adaptive Verknüpfungen. 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 Speichererteilung im Batchmodus. Weitere Informationen finden Sie unter Batchmodus Memory Grant Feedback. 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 der 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 interleavierte Ausführung für Tabellenwertfunktionen mit mehreren Anweisungen. Weitere Informationen finden Sie unter Interleaved execution for multi-statement table-valued functions. Gilt für: SQL Server 2017 (14.x) und höhere Versionen sowie Azure SQL-Datenbank |
'DISABLE_OPTIMIZED_NESTED_LOOP' |
Weist den Abfrageprozessor an, beim Generieren eines Abfrageplans keinen Sortiervorgang (Batchsortierung) für optimierte geschachtelte Schleifenverknüppungen zu verwenden. Dieser Hinweisname entspricht Ablaufverfolgungskennzeichnung 2340. Dieser Hinweis gilt auch für explizite Sortierungen und Batchsortierungen. |
'DISABLE_OPTIMIZER_ROWGOAL'
|
Bewirkt, dass SQL Server einen Plan generiert, 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 beim Kompilieren einer Abfrage mit einem oder mehreren Parametern zu verwenden. Diese Anweisung macht den Abfrageplan unabhängig vom Parameterwert, der beim Kompilieren der Abfrage verwendet wurde. Dieser Hinweisname entspricht Ablaufverfolgungskennzeichnung 4136 oder Konfiguration mit Datenbankbereich Einstellung PARAMETER_SNIFFING = OFF . |
'DISABLE_ROW_MODE_MEMORY_GRANT_FEEDBACK' |
Deaktiviert das Feedback zur Speichererteilung im Zeilenmodus. Weitere Informationen finden Sie unter Speicher im Zeilenmodus,. Gilt für: SQL Server 2019 (15.x) und höhere Versionen sowie Azure SQL-Datenbank |
'DISABLE_TSQL_SCALAR_UDF_INLINING' |
Deaktiviert skalare UDF-Inlining. Weitere Informationen finden Sie unter Scalar UDF Inlining. 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' |
Ermöglicht automatisch generierte schnelle Statistiken (Histogrammänderung) für jede führende Indexspalte, für die eine 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 Ablaufverfolgungskennzeichnung 4139. |
'ENABLE_QUERY_OPTIMIZER_HOTFIXES' |
Aktiviert Query Optimizer-Hotfixes (Änderungen, die in kumulativen SQL Server-Updates und Service Packs veröffentlicht wurden). Dieser Hinweisname entspricht Ablaufverfolgungskennzeichnung 4199 oder Konfiguration mit Datenbankbereich Einstellung QUERY_OPTIMIZER_HOTFIXES = ON . |
'FORCE_DEFAULT_CARDINALITY_ESTIMATION' |
Erzwingt den Abfrageoptimierer, Kardinalitätsschätzung Modell zu verwenden, das der aktuellen Datenbankkompatibilitätsstufe entspricht. Verwenden Sie diesen Hinweis, um Datenbankbereichskonfiguration Einstellung LEGACY_CARDINALITY_ESTIMATION = ON oder Ablaufverfolgungskennzeichnung 9481 außer Kraft zu setzen. |
'FORCE_LEGACY_CARDINALITY_ESTIMATION'
|
Erzwingt den Abfrageoptimierer, Kardinalitätsschätzung Modell von SQL Server 2012 (11.x) und früheren Versionen zu verwenden. Dieser Hinweisname entspricht Ablaufverfolgungskennzeichnung 9481 oder Datenbankkonfiguration Einstellung LEGACY_CARDINALITY_ESTIMATION = ON . |
'QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n'
1 |
Erzwingt das Abfrageoptimiererverhalten auf Abfrageebene. Dieses Verhalten geschieht so, als ob die Abfrage mit der Datenbankkompatibilitätsebene nkompiliert wurde, wobei n eine unterstützte Datenbankkompatibilitätsstufe ist. Eine Liste der derzeit unterstützten Werte für nfinden Sie unter sys.dm_exec_valid_use_hints. gilt für: SQL Server 2017 (14.x) CU 10 und höher sowie Azure SQL-Datenbank |
'QUERY_PLAN_PROFILE'
2 |
Ermöglicht einfache Profilerstellung für die Abfrage. Wenn eine Abfrage, die diesen neuen Hinweis enthält, abgeschlossen ist, wird ein neues erweitertes Ereignis, query_plan_profile , 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, jedoch 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öher |
1 Der hinweis QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n
setzt die Standard- oder Legacy-Kardinalitätsschätzungseinstellung nicht außer Kraft, wenn Sie dies durch datenbankbereichsbezogene Konfiguration, Ablaufverfolgungskennzeichnung oder einen anderen Abfragehinweis wie QUERYTRACEON
erzwingen. Dieser Hinweis wirkt sich nur auf das Verhalten des Abfrageoptimierrs aus. Es wirkt sich nicht auf andere Features von SQL Server aus, die möglicherweise von der Datenbankkompatibilitätsebeneabhängen, z. B. die Verfügbarkeit bestimmter Datenbankfeatures. Weitere Informationen finden Sie unter Entwicklerauswahl: Hinting Query Execution Model.
2 Wenn Sie das Sammeln des query_post_execution_showplan
erweiterten Ereignisses aktivieren, wird jeder Abfrage, die auf dem Server ausgeführt wird, eine Standardmäßige Profilerstellungsinfrastruktur hinzugefügt und kann sich daher auf die gesamte Serverleistung auswirken. Wenn Sie stattdessen die Sammlung von query_thread_profile
erweiterten Ereignis aktivieren, um stattdessen 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
erweitertes Ereignis aktivieren, aktiviert dies nur die einfache Profilerstellungsinfrastruktur für eine Abfrage, die mit dem query_plan_profile
ausgeführt wird, und wirkt sich daher nicht auf andere Arbeitslasten auf dem Server aus. Verwenden Sie diesen Hinweis, um eine bestimmte Abfrage zu profilieren, ohne dass sich dies auf andere Teile der Serverarbeitsauslastung auswirkt. 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_hintsabgefragt werden.
Wichtig
Einige USE HINT
Hinweise können mit Ablaufverfolgungskennzeichnungen, die auf globaler oder Sitzungsebene aktiviert sind, oder konfigurationseinstellungen mit Datenbankbereich in Konflikt stehen. In diesem Fall hat der Hinweis auf Abfrageebene (USE HINT
) immer Vorrang. Wenn ein USE HINT
mit einem anderen Abfragehinweis in Konflikt steht oder ein Ablaufverfolgungskennzeichnung auf Abfrageebene (z. B. durch 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_planangegeben wurde.
USE PLAN
können nicht mit INSERT
, UPDATE
, MERGE
oder 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
angegebenen Plan identisch ist, kann die Leistung der Pläne variieren. In seltenen Fällen kann der Leistungsunterschied signifikant 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 Ansicht an, die exposed_object_nameentspricht. Es wird empfohlen, einen Tabellenhinweis nur im Kontext einer Planhinweisliste als Abfragehinweis zu verwenden.
exposed_object_name kann eine der folgenden Verweise sein:
Wenn ein Alias für die Tabelle oder Ansicht in der FROM Klausel der Abfrage 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 beispielsweise auf die Tabelle oder Ansicht mit einem zweiteiligen Namen verwiesen wird, ist exposed_object_name derselbe zweiteilige Name.
Wenn Sie exposed_object_name angeben, ohne auch einen Tabellenhinweis anzugeben, werden alle Indizes, die Sie in der Abfrage als Teil eines Tabellenhinweiss für das Objekt angeben, ignoriert. Der Abfrageoptimierer bestimmt dann die Indexverwendung. Sie können diese Technik verwenden, um die Auswirkung 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
werden nicht als Abfragehinweise zugelassen, es sei denn, die Abfrage verfügt bereits über eine WITH
Klausel, die den Tabellenhinweis angibt. Weitere Informationen finden Sie im Abschnitt Hinweise.
Vorsicht
Das Angeben von FORCESEEK
mit Parametern beschränkt die Anzahl der Pläne, die vom Abfrageoptimierer berücksichtigt werden können, mehr als beim Angeben von FORCESEEK
ohne Parameter. Dies kann dazu führen, dass ein Fehler "Plan kann nicht generiert werden" in weiteren Fällen auftreten.
FOR TIMESTAMP AS OF 'point_in_time'
gilt für: Microsoft Fabric Data Warehouse
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 die point_in_time im Format yyyy-MM-ddTHH:mm:ss[.fff]
an, um Daten zurückzugeben, wie sie zu diesem Zeitpunkt angezeigt wurden. Die Zeitzone befindet sich immer in UTC. Verwenden Sie die CONVERT
-Syntax für das erforderliche Datetime-Format mit style 126.
Der TIMESTAMP AS OF
Hinweis kann nur einmal mithilfe der OPTION
-Klausel angegeben werden. Weitere Informationen und Einschränkungen finden Sie unter Abfragedaten, wie sie in der Vergangenheitvorhanden waren.
FORCE [ EINZELNER KNOTEN | VERTEILT ] PLAN
gilt für: Microsoft Fabric Data Warehouse
Ermöglicht dem Benutzer auszuwählen, ob ein einzelner Knotenplan oder ein verteilter Plan für die Ausführung einer Abfrage erzwungen werden soll.
Bemerkungen
Abfragehinweise können in einer INSERT
-Anweisung nicht angegeben werden, außer wenn eine SELECT
Klausel innerhalb der Anweisung verwendet wird.
Abfragehinweise können nur in der Abfrage auf oberster 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
, FORCESCAN
oder FORCESEEK
Tabellenhinweiss als Abfragehinweis nur im Kontext einer Plananleitung. Planhandbücher sind nützlich, wenn Sie die ursprüngliche Abfrage nicht ändern können, z. B. weil es sich um eine Drittanbieteranwendung handelt. 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 bei Testplanleitfadenanweisungen. Für alle anderen Ad-hoc-Abfragen wird empfohlen, diese Hinweise nur als Tabellenhinweise anzugeben.
Bei Angabe als Abfragehinweis sind die INDEX
, FORCESCAN
und FORCESEEK
Tabellenhinweise für die folgenden Objekte gültig:
- Tabellen
- Ansichten
- Indizierte Sichten
- Allgemeine Tabellenausdrücke (der Hinweis muss in der
SELECT
-Anweisung angegeben werden, deren Resultset den allgemeinen Tabellenausdruck auffüllt) - Dynamische Verwaltungsansichten (Dynamic Management Views, DMVs)
- Benannte Unterabfragen
Sie können INDEX
, FORCESCAN
und FORCESEEK
Tabellenhinweise als Abfragehinweise für eine Abfrage angeben, die keine Tabellenhinweise enthält. 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
werden nicht als Abfragehinweise zugelassen, es sei denn, die Abfrage verfügt bereits über eine WITH
Klausel, die den Tabellenhinweis angibt. In diesem Fall muss auch ein übereinstimmende Hinweis als Abfragehinweis angegeben werden. Geben Sie den übereinstimmenden Hinweis als Abfragehinweis an, indem Sie TABLE HINT
in der OPTION
-Klausel verwenden. Diese Spezifikation behält die Semantik der Abfrage bei. Wenn die Abfrage beispielsweise den Tabellenhinweis NOLOCK
enthält, muss die OPTION
-Klausel im @hints Parameter der Plananleitung auch den NOLOCK
Hinweis enthalten. Siehe Beispiel K.
Angeben von Hinweisen mit Abfragespeicherhinweisen
Sie können Hinweise auf Abfragen erzwingen, die über den Abfragespeicher identifiziert wurden, ohne Codeänderungen vorzunehmen, indem Sie die Abfragespeicherhinweise Feature verwenden. Verwenden Sie die sys.sp_query_store_set_hints gespeicherte Prozedur, um einen Hinweis auf eine Abfrage anzuwenden. Siehe Beispiel N.
Abfragehinweisunterstützung in Fabric Data Warehouse
Microsoft Fabric Data Warehouse unterstützt eine Teilmenge von Abfragehinweisen:
HASH GROUP
ORDER GROUP
MERGE UNION
HASH UNION
CONCAT UNION
FORCE ORDER
USE HINT
ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES
ASSUME_FULL_INDEPENDENCE_FOR_FILTER_ESTIMATES
ASSUME_PARTIAL_CORRELATION_FOR_FILTER_ESTIMATES
ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS
Diese Abfragehinweise sind exklusiv für Microsoft Fabric Data Warehouse:
-
FORCE SINGLE NODE PLAN
,FORCE DISTRIBUTED PLAN
Beispiele
A. Zusammenführen von JOIN verwenden
Im folgenden Beispiel wird angegeben, dass MERGE JOIN
den JOIN
Vorgang in der Abfrage ausführt. 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, den Wert 'Seattle'
für @city_name
zu verwenden und beim Optimieren der Abfrage die durchschnittliche Selektorivität des Prädikats für alle Spaltenwerte für @postal_code
zu verwenden. 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
können verwendet werden, um zu verhindern, dass ein schlecht gebildeter rekursiver allgemeiner Tabellenausdruck in eine Endlosschleife eintritt. Im folgenden Beispiel wird absichtlich eine Endlosschleife erstellt und der MAXRECURSION
Hinweis verwendet, um die Anzahl der Rekursionsstufen auf zwei zu begrenzen. 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, ist MAXRECURSION
nicht mehr erforderlich.
D. ZUSAMMENFÜHREN UNION verwenden
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
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 hinweis INDEX
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 FORCESEEK
Im folgenden Beispiel wird der FORCESEEK
Tabellenhinweis verwendet. Die TABLE HINT
-Klausel muss auch den gleichen zweiteiligen Namen wie der name des verfügbar gemachten Objekts 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 mehrerer Tabellenhinweise
Das folgende Beispiel wendet den INDEX
Hinweis auf eine Tabelle und den FORCESEEK
Hinweis auf eine andere an. 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 Tabellenhinweiss
Das folgende Beispiel zeigt, wie Sie den TABLE HINT
Hinweis verwenden. Sie können den Hinweis verwenden, ohne einen Hinweis anzugeben, um das INDEX
Tabellenhinweisverhalten außer Kraft zu setzen, das Sie in der FROM
Klausel der Abfrage angeben. 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 semantischen Auswirkungen auf Tabellenhinweise
Das folgende Beispiel enthält zwei Tabellenhinweise in der Abfrage: NOLOCK
, die semantisch beeinflussen, und INDEX
, was nicht semantisch beeinflusst wird. 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
und FORCESEEK
Hinweise an, und ersetzen Sie den nicht semantischen INDEX
Hinweis 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 zum Beibehalten der Semantik der Abfrage und dem Optimierer die Auswahl eines anderen Indexes als den im Tabellenhinweis angegebenen Index. Erlauben Sie dem Optimierer die Auswahl, indem Sie den NOLOCK
Hinweis in der OPTIONS
-Klausel angeben. Sie geben den Hinweis an, da er semantisch beeinflusst wird. Geben Sie dann das schlüsselwort TABLE HINT
nur mit einem Tabellenverweis und keine INDEX
hinweis 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. Use USE HINT
Im folgenden Beispiel werden die RECOMPILE
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 alle planbezogenen Hotfixes aktivieren, die durch Ablaufverfolgungskennzeichnung 4199 für eine bestimmte Abfrage gesteuert werden, indem Sie die folgende Abfrage verwenden:
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199);
Sie können auch mehrere Ablaufverfolgungskennzeichnungen wie in der folgenden Abfrage verwenden:
SELECT * FROM Person.Address
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (QUERYTRACEON 4199, QUERYTRACEON 4137);
N. Verwenden von Abfragespeicherhinweisen
Die Abfragespeicherhinweise Feature in Azure SQL-Datenbank bietet eine einfach zu verwendende Methode zum Gestalten von Abfrageplänen, ohne den Anwendungscode zu ändern.
Identifizieren Sie zunächst die Abfrage, die bereits in den Abfragespeicherkatalogansichten ausgeführt wurde, z. B.:
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
The following example applies the hint to force the legacy cardinality estimator to query_id 39, identified in Query Store:
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
des konfigurierten Speicherlimits auf query_id
39 zu erzwingen, die im Abfragespeicher identifiziert werden:
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 Verhalten der SQL Server 2012 -Abfrageoptimierer (11.x):
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 ab einem Zeitpunkt
gilt für: Warehouse in Microsoft Fabric
Verwenden Sie die TIMESTAMP
-Syntax in der OPTION
-Klausel, um Daten wie in der Vergangenheit in Synapse Data Warehouse in Microsoft Fabric abzufragen. Die folgende Beispielabfrage gibt Daten zurück, wie sie am 13. März 2024 um 13:39:35.28 Uhr UTC erschien. Die Zeitzone befindet sich immer in UTC.
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
Verwandte Inhalte
- OPTION-Klausel (Transact-SQL)
- Hinweise (Transact-SQL)
- Abfragespeicherhinweise
- Planhinweislisten
- DBCC TRACEON – Ablaufverfolgungsflags (Transact-SQL)