Freigeben über


Abfragehinweise (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

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 JOINoder 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 NOEXPANDfinden 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, , UPDATEund DELETE MERGEAnweisungen.

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 RECOMPILEspeichert 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_profileabgeschlossen 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 PLANkann nicht mit INSERT, , UPDATEoder MERGEDELETE 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 PLANden 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, FORCESCANund 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 INDEXHinweiss oder FORCESEEK FORCESCANder 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 INDEXHinweise FORCESCANund 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 angebenINDEXFORCESCAN, für die keine Tabellenhinweise vorhanden sind. Sie können sie auch verwenden, um vorhandene INDEX, FORCESCANoder FORCESEEK Hinweise in der Abfrage zu ersetzen.

Tabellenhinweise außer INDEX, FORCESCANund 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 NOLOCKenthä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 INDEXdie 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 1und 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