Hinweise (Transact-SQL) – Abfrage

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Abfragehinweise sind Hinweise, die im Bereich einer Abfrage verwendet werden. Sie wirken sich auf alle Operatoren in der Anweisung aus. Falls UNION in der Hauptabfrage vorkommt, kann nur die letzte Abfrage, die eine UNION-Operation enthält, die OPTION-Klausel aufweisen. Abfragehinweise werden 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 ] ] )
}

<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'
}

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente

{ HASH | ORDER } GROUP

Gibt an, dass die in der GROUP BY- oder DISTINCT-Klausel der Abfrage beschriebenen Aggregationen Hash- oder Sortiervorgänge verwenden sollen.

{ MERGE | HASH | CONCAT } UNION

Gibt an, dass alle UNION-Vorgänge mithilfe von Merge-, Hash- oder Verkettungsvorgängen für die bei UNION vorkommenden Mengen ausgeführt werden. Wenn mehr als ein UNION-Hinweis angegeben wird, wählt der Abfrageoptimierer unter den angegebenen Hinweisen die Strategie mit dem geringsten Aufwand aus.

{ LOOP | MERGE | HASH } JOIN

Gibt an, dass alle Joinvorgänge per LOOP JOIN, MERGE JOIN oder HASH JOIN in der gesamten Abfrage ausgeführt werden. Wenn Sie mehr als einen Joinhinweis angeben, wählt der Optimierer unter den zulässigen Hinweisen die Strategie mit dem geringsten Aufwand aus.

Wenn Sie in der FROM-Klausel derselben Abfrage für ein bestimmtes Tabellenpaar einen Joinhinweis angeben, hat dieser Joinhinweis Vorrang bei der Verknüpfung der beiden Tabellen. Die Abfragehinweise müssen jedoch auch 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 Joinhinweise (Transact-SQL).

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 Sicht wird nicht erweitert, 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 (Verwenden von NOEXPAND).

Der Hinweis wirkt sich nur auf die Ansichten im SELECT-Teil von Anweisungen aus, einschließlich der Ansichten in den Anweisungen INSERT, UPDATE, MERGE und DELETE.

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 von FORCE ORDER hat keine Auswirkung auf das mögliche Rollentauschverhalten des Abfrageoptimierers.

Hinweis

In einer MERGE-Anweisung wird als Standardreihenfolge für Joins zunächst auf die Quelltabelle und dann auf die Zieltabelle zugegriffen, es sei denn, die WHEN SOURCE NOT MATCHED-Klausel wurde angegeben. Wenn Sie FORCE ORDER angeben, 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. Wird nicht in den Azure-Speicher weitergegeben.

{ FORCE | DISABLE } SCALEOUTEXECUTION

Erzwingen oder Deaktivieren der Skalierungsausführung von PolyBase-Abfragen, die externe Tabellen in SQL Server 2019-Big Data-Cluster verwenden. Dieser Hinweis wird nur von einer Abfrage berücksichtigt, die die Masterinstanz eines SQL-Big Data-Clusters verwendet. Das Aufskalieren erfolgt über den Computepool des Big Data-Clusters.

KEEP PLAN

Ändert die Schwellenwerte für Neukompilierung für temporäre Tabellen und macht sie identisch mit denen permanenter Tabellen. Der geschätzte Recompile-Neukompilierungsschwellenwert startet ein automatisches Neukompilieren für die Abfrage, wenn die geschätzte Anzahl von indizierten Spaltenänderungen in einer Tabelle durch Ausführen einer der folgenden Anweisungen vorgenommen wurde:

  • UPDATE
  • Delete
  • MERGE
  • INSERT

Durch Angeben von KEEP PLAN wird sichergestellt, dass eine Abfrage nicht zu häufig erneut kompiliert wird, wenn an einer Tabelle mehrere Updates ausgeführt werden.

KEEPFIXED PLAN

Zwingt den Abfrageoptimierer, die Abfrage aufgrund von Änderungen in den Statistiken nicht erneut zu kompilieren. Durch Angabe von KEEPFIXED PLAN wird sichergestellt, dass eine Abfrage nur dann erneut kompiliert wird, wenn das Schema der zugrunde liegenden Tabellen geändert oder für diese Tabellen sp_recompile 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 Speicherzuweisung in Prozent des konfigurierten Arbeitsspeicherlimits. 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 minimale Größe der Speicherzuweisung in Prozent des konfigurierten Arbeitsspeicherlimits. 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 konfigurierten Wert überschreiten. Wenn MAXDOP den mit Resource Governor konfigurierten Wert überschreitet, verwendet die Datenbank-Engine den in ALTER WORKLOAD GROUP (Transact-SQL) beschriebenen MAXDOP-Wert von Resource Governor. Alle mit der Konfigurationsoption Max. Grad an Parallelität verwendeten semantischen Regeln gelten auch für die Verwendung des MAXDOP-Abfragehinweises. Weitere Informationen finden Sie unter Konfigurieren der Serverkonfigurationsoption Max. Grad an Parallelität.

Warnung

Wenn MAXDOP auf 0 (null) festgelegt wird, wählt der Server den maximalen Grad an Parallelität aus.

MAXRECURSION <integer_value>

Gibt die maximale Anzahl der für diese Abfrage zulässigen Rekursionen an. number ist eine nicht negative 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 der angegebene Wert bzw. der Standardwert für MAXRECURSION während der Ausführung der Abfrage erreicht wird, wird die Abfrage beendet und ein Fehler wird zurückgegeben.

Aufgrund dieses Fehlers wird für alle Änderungen aufgrund der Anweisung ein Rollback ausgeführt. Wenn es sich bei der Anweisung um eine SELECT-Anweisung handelt, werden teilweise Ergebnisse 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 (Transact-SQL).

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). Der Spooloperator kann die Leistung in einigen Szenarien verringern. 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 HINWEIS "OPTIMIZE FOR"-Abfrage zugewiesen werden kann.

  • UNBEKANNT

    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, dem @variable_name für die Verwendung mit dem Abfragehinweis OPTIMIZE FOR zugewiesen wird. <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 Sie OPTIMIZE FOR auch, wenn Sie Planhinweislisten erstellen. Weitere Informationen finden Sie unter Erneutes Kompilieren einer gespeicherten Prozedur.

OPTIMIZE FOR UNKNOWN

Weist den Abfrageoptimierer an, für alle Spaltenwerte die durchschnittliche Selektivität des Prädikats anstelle des Werts für den Runtime-Parameter 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 Parametrisierungsregeln an, die der SQL Server-Abfrageoptimierer bei der Kompilierung auf die Abfrage anwendet.

Wichtig

Der PARAMETERIZATION-Abfragehinweis kann in einer Planhinweisliste nur angegeben werden, um die aktuelle Einstellung der Option PARAMETERIZATION database SET zu überschreiben. Er kann nicht direkt innerhalb einer Abfrage angegeben werden.

Weitere Informationen finden Sie unter Angeben des Abfrageparametrisierungsverhaltens mithilfe von Planhinweislisten.

Mit SIMPLE wird der Abfrageoptimierer angewiesen, einfache Parametrisierung auszuführen. Mit FORCED wird der Abfrageoptimierer angewiesen, eine erzwungene Parametrisierung auszuführen. 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 Option QUERYTRACEON wird nur für Ablaufverfolgungsflags des Abfrageoptimierers unterstützt. Weitere Informationen finden Sie unter Ablaufverfolgungsflags.

Bei dieser Option wird jedoch weder ein Fehler noch eine Warnung zurückgegeben, wenn eine nicht unterstützte Ablaufverfolgungsflagnummer verwendet wird. Wenn das angegebene Ablaufverfolgungsflag keines ist, das sich auf den Ausführungsplan der Abfrage auswirkt, wird die Option einfach ignoriert.

Wenn Sie mehr als ein Ablaufverfolgungsflag in einer Abfrage verwenden möchten, geben Sie einen QUERYTRACEON-Hinweis für jede Ablaufverfolgungsflagnummer 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 im Cache gespeicherten Plan, wenn dieselbe Abfrage ohne den Hinweis RECOMPILE ausgeführt wird. Ohne die Angabe von RECOMPILE werden Abfragepläne von Datenbank-Engine zwischengespeichert und wiederverwendet. Beim Kompilieren von Abfrageplänen 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 nicht die gesamte gespeicherte Prozedur, sondern nur eine Teilmenge davon erneut kompiliert werden muss. Weitere Informationen finden Sie unter Erneutes Kompilieren einer gespeicherten Prozedur. RECOMPILE ist auch beim Erstellen von Planhinweislisten hilfreich.

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. 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 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. Zeilen können Spalten mit variabler Länge enthalten; mit dem Datenbank-Engine können Zeilen definiert werden, die eine maximale potenzielle Größe aufweisen, die über die Fähigkeit der Datenbank-Engine hinausgeht, sie zu verarbeiten. 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 eine oder mehrere zusätzliche Hinweise für den Abfrageprozessor bereit. Die zusätzlichen Hinweise werden von einem Hinweisnamen innerhalb einfacher Anführungszeichen angegeben.

Die folgenden Hinweisnamen werden unterstützt:

  • 'ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'

    Bewirkt, dass SQL Server unter dem Kardinalitätsschätzungsmodell für den Abfrageoptimierer von SQL Server 2014 (12.x) oder einer neueren Version einen Abfrageplan mithilfe der Simple-Containment-Annahme statt mit der Base-Containment-Annahme generiert. Dieser Hinweisname entspricht Ablaufverfolgungsflag 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 Ablaufverfolgungsflag 4137, wenn es mit dem Kardinalitätsschätzungsmodell von SQL Server 2012 (11.x) und früheren Versionen verwendet wird, und hat ähnliche Auswirkungen, wenn das Ablaufverfolgungsflag 9471 mit dem Kardinalitätsschätzungsmodell von SQL Server 2014 (12.x) oder einer neueren Version 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 das Äquivalent zu Ablaufverfolgungsflag 9472, wenn es mit dem Kardinalitätsschätzungsmodell von SQL Server 2014 (12.x) verwendet wird.

    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) oder höher.

    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 (ab SQL Server 2017 (14.x)) und 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 (ab SQL Server 2017 (14.x)) und 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 (ab SQL Server 2019 (15.x)) und 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 (ab SQL Server 2017 (14.x)) und 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 Ablaufverfolgungsflag 2340.

  • '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 Ablaufverfolgungsflag 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 Ablaufverfolgungsflag 4136 oder der Einstellung PARAMETER_SNIFFING = OFF für die Datenbankweit gültige Konfiguration.

  • '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 (ab SQL Server 2019 (15.x)) und 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 (ab SQL Server 2019 (15.x)) und Azure SQL-Datenbank

  • 'DISALLOW_BATCH_MODE'

    Deaktiviert die Batchmodusausführung. Weitere Informationen finden Sie unter Ausführungsmodi.

    Gilt für: SQL Server (ab SQL Server 2019 (15.x)) und 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 für die Kardinalitätsschätzung verwendete Histogramm wird zum Zeitpunkt der Abfragekompilierung angepasst, damit der tatsächliche Höchst- und Mindestwert in dieser Spalte berücksichtigt werden. Dieser Hinweisname entspricht Ablaufverfolgungsflag 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 Ablaufverfolgungsflag 4199 oder der Einstellung QUERY_OPTIMIZER_HOTFIXES = ON für die Datenbankweit gültige Konfiguration.

  • '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 Einstellung LEGACY_CARDINALITY_ESTIMATION = ON für die Datenbankweit gültige Konfiguration zu überschreiben, oder das Ablaufverfolgungsflag 9481.

  • '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 Ablaufverfolgungsflag 9481 oder der Einstellung LEGACY_CARDINALITY_ESTIMATION = ON für die Datenbankweit gültige Konfiguration.

  • QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n

    Erzwingt das Verhalten des Abfrageoptimierers auf Abfrageebene. Dieses Verhalten entspricht dem, wenn die Abfrage mit dem Datenbank-Kompatibilitätsgrad n kompiliert wird, wobei n ein unterstützter Datenbank-Kompatibilitätsgrad ist (z. B. 100 oder 130). Unter sys.dm_exec_valid_use_hints finden Sie eine Liste der zurzeit unterstützten Werte für n.

    Gilt für: SQL Server (ab SQL Server 2017 (14.x) CU10) und Azure SQL-Datenbank

    Hinweis

    Der Hinweis QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n überschreibt keine standardmäßigen oder älteren Einstellungen für die Kardinalitätsschätzung, wenn er durch eine datenbankweite Konfiguration, ein Ablaufverfolgungsflag oder einen anderen Abfragehinweis wie QUERYTRACEON erzwungen wurde.
    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 zu diesem Hinweis finden Sie unter Developer's Choice: Hinting Query Execution model (Von Entwicklern inspiriert: Modell für die Ausführung von Hinweisabfragen).

  • 'QUERY_PLAN_PROFILE'

    Aktiviert einfache Profilerstellung für die Abfrage. Wenn eine Abfrage, die diesen neuen Hinweis enthält, abgeschlossen wird, wird ein neues erweitertes Ereignis, query_plan_profile, ausgelöst. Dieses erweiterte Ereignis macht Ausführungsstatistiken und ein tatsächliches Ausführungsplan-XML verfügbar, das dem erweiterten Ereignis query_post_execution_showplan ähnelt, aber nur für Abfragen, die den neuen Hinweis enthalten.

    Gilt für: SQL Server (ab SQL Server 2016 (13.x) SP2 CU3 und SQL Server 2017 (14.x) CU11).

    Hinweis

    Wenn Sie das Sammeln des query_post_execution_showplan erweiterten Ereignisses aktivieren, wird dadurch jede Abfrage, die auf dem Server ausgeführt wird, standardmäßige Profilerstellungsinfrastruktur hinzugefügt und kann sich daher auf die gesamte Serverleistung auswirken.
    Wenn Sie stattdessen die Sammlung des query_thread_profile erweiterten Ereignisses für die Verwendung der einfachen Profilerstellungsinfrastruktur aktivieren, 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, wird dadurch nur die einfache Profilerstellungsinfrastruktur für eine Abfrage aktiviert, die mit den query_plan_profile ausgeführten und daher keine Auswirkungen auf andere Arbeitslasten 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 Profilerstellungsinfrastruktur für Abfragen.

Die Liste aller unterstützten USE HINT-Namen kann über die dynamische Verwaltungsansicht sys.dm_exec_valid_use_hints abgefragt werden.

Tipp

Bei Hinweisnamen muss die Groß-/Kleinschreibung nicht beachtet 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 USE HINT-Hinweis mit einem anderen Abfragehinweis oder einem auf Abfrageebene aktivierten Ablaufverfolgungsflag (z.B. QUERYTRACEON) in Konflikt steht, generiert SQL Server beim Versuch der Abfrageausführung einen Fehler.

USE PLAN N'<xml_plan>'

Zwingt den Abfrageoptimierer, einen vorhandenen Abfrageplan für eine Abfrage zu verwenden, die mit <xml_plan> angegeben wird. USE PLAN kann nicht für die Anweisungen INSERT, UPDATE, MERGE oder DELETE angegeben werden.

Der durch dieses Feature erzwungene resultierende Ausführungsplan entspricht oder ähnelt dem Plan, der erzwungen wird. Da der resultierende Plan möglicherweise nicht mit dem von 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 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, entspricht exposed_object_name genau der Tabelle oder der 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 Vorgehensweise verwenden, um die Auswirkung eines INDEX-Tabellenhinweises zu eliminieren, 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

Dieser Tabellenhinweis ist auf die Tabelle oder die Sicht anzuwenden, die Name_des_verfuegbar_gemachten_Objekts als Abfragehinweis entspricht. Eine Beschreibung dieser Hinweise finden Sie unter Tabellenhinweise (Transact-SQL).

Andere Tabellenhinweise als INDEX, FORCESCAN und FORCESEEK sind als Abfragehinweise nicht zulässig, es sei denn, die Abfrage enthält bereits eine WITH-Klausel, die einen Tabellenhinweis angibt. Weitere Informationen finden Sie im Abschnitt Bemerkungen.

Achtung

Die Angabe von FORCESEEK mit Parametern schränkt die Anzahl von Plänen, die vom Abfrageoptimierer berücksichtigt werden können, stärker ein als die Angabe von FORCESEEK ohne Parameter. Dies kann dazu führen, dass ein Fehler "Plan kann nicht generiert werden" in weiteren Fällen auftreten.

Hinweise

Abfragehinweise können nur dann in einer INSERT-Anweisung angegeben werden, 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 genau mit dem Namen des verfügbar gemachten Objekts in der Abfrage oder Unterabfrage übereinstimmen.

Angeben von Tabellenhinweisen als Abfragehinweise

Es wird empfohlen, den INDEX-, FORCESCAN- oder FORCESEEK-Tabellenhinweis nur im Zusammenhang mit einer Planhinweisliste als Abfragehinweis zu verwenden. Planhinweislisten sind nützlich, wenn Sie die ursprüngliche Abfrage nicht ändern können, beispielsweise bei Anwendungen von Drittanbietern. Der in der Planhinweisliste angegebene Abfragehinweis wird vor dem Kompilieren und Optimieren zur Abfrage hinzugefügt. Verwenden Sie für Ad-hoc-Abfragen die TABLE HINT-Klausel nur dann, wenn Sie Planhinweislisten-Anweisungen testen. Es wird empfohlen, für alle anderen Ad-hoc-Abfragen diese Hinweise nur als Tabellenhinweise anzugeben.

Wenn die INDEX-, FORCESCAN- und FORCESEEK-Tabellenhinweise als Abfragehinweise angegeben werden, sind sie für die folgenden Objekte gültig:

  • Tabellen
  • Sichten
  • Indizierte Sichten
  • Allgemeine Tabellenausdrücke (Der Hinweis muss in der SELECT-Anweisung angegeben sein, mit deren Resultset der allgemeine Tabellenausdruck aufgefüllt wird.)
  • Dynamische Verwaltungssichten (DMVs)
  • Benannte Unterabfragen

Sie können INDEX-, FORCESCAN- und FORCESEEK-Tabellenhinweise als Abfragehinweise für eine Abfrage angeben, die keine vorhandenen Tabellenhinweise enthält. Sie können sie auch verwenden, um bereits vorhandene INDEX-, FORCESCAN- oder FORCESEEK-Hinweise in der Abfrage zu ersetzen.

Andere Tabellenhinweise als INDEX, FORCESCAN und FORCESEEK sind als Abfragehinweise nicht zulässig, es sei denn, die Abfrage enthält bereits eine WITH-Klausel, die einen Tabellenhinweis angibt. In diesem Fall muss auch ein übereinstimmender 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 Klausel OPTION im Parameter @hints der Planhinweisliste ebenfalls den Hinweis NOLOCK 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

Das folgende Beispiel gibt an, 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, 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 fehlerhaft formatierter allgemeiner Tabellenausdruck in eine Endlosschleife gerät. Im folgenden Beispiel wird absichtlich eine Endlosschleife erstellt. Zudem wird der MAXRECURSION-Hinweis verwendet, um die Anzahl der Rekursionsebenen 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

Sobald der Fehler im Code behoben wurde, wird MAXRECURSION nicht mehr benötigt.

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 der MERGE UNION- und der FAST-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 (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 der INDEX-Hinweis auf eine Tabelle angewendet wird, die einen Alias verwendet, muss in beiden Beispielen in der TABLE HINT-Klausel auch der gleiche Alias wie der verfügbare Objektname angegeben werden. 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 den gleichen zweiteiligen Namen wie der Name des exponierten 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 von mehreren Tabellenhinweisen

Im folgenden Beispiel wird der INDEX-Hinweis auf eine Tabelle angewendet, und der FORCESEEK-Hinweis wird auf eine andere Tabelle 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

Im folgenden Beispiel wird die Verwendung des TABLE HINT-Hinweises gezeigt. Sie können den Hinweis ohne Angabe eines Hinweises verwenden, um das Verhalten des INDEX-Tabellenhinweises zu überschreiben, den 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 Tabellenhinweisen, die die Semantik beeinflussen

Das folgende Beispiel enthält in der Abfrage zwei Tabellenhinweise: den NOLOCK-Hinweis, der die Semantik beeinflusst, und den INDEX-Hinweis, der die Semantik nicht beeinflusst. Der NOLOCK-Hinweis wird in der OPTIONS-Klausel der Planhinweisliste angegeben, um die Semantik der Abfrage beizubehalten. Geben Sie neben dem NOLOCK-Hinweis die INDEX- und FORCESEEK-Hinweise an, und ersetzen Sie den nicht INDEX-Hinweis,der die Semantik nicht beeinflusst, in der Abfrage bei der Kompilierung und Optimierung von Anweisungen. 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. Lassen Sie den Abfrageoptimierer wählen, 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 mit nur einem Tabellenverweis und ohne 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. Verwenden von USE HINT

Im folgenden Beispiel werden der RECOMPILE- und der USE HINT-Abfragehinweis 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 Speicherzuweisungsgröße in PERCENT des konfigurierten Arbeitsspeicherlimits auf query_id 39 zu erzwingen, identifiziert im Abfragespeicher:

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 des SQL 2012-Abfrageoptimiererverhaltens:

EXEC sys.sp_query_store_set_hints @query_id= 39,
    @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';