Freigeben über


sys.sp_query_store_set_hints (Transact-SQL)

Gilt für: SQL Server 2022 (16.x) Azure SQL-DatenbankAzure SQL Managed Instance

Erstellt oder aktualisiert Abfragespeicher Hinweise für einen bestimmten query_id.

Transact-SQL-Syntaxkonventionen

Syntax

sp_query_store_set_hints
    [ @query_id = ] query_id ,
    [ @query_hints = ] 'query_hints'
    [ , [ @query_hint_scope = ] 'replica_group_id' ]
[ ; ]

Argumente

Wichtig

Argumente für erweiterte gespeicherte Prozeduren müssen in der spezifischen Reihenfolge eingegeben werden, wie im Abschnitt Syntax beschrieben. Wenn die Parameter außerhalb der Reihenfolge eingegeben werden, tritt eine Fehlermeldung auf.

[ @query_id = ] query_id

Die Abfragespeicher query_id Spalte aus sys.query_store_query. @query_id ist groß.

[ @query_hints = ] N'query_hints'

Eine Zeichenfolge mit Abfrageoptionen beginnend mit OPTION. @query_hints ist nvarchar(max). Weitere Informationen finden Sie unter "Unterstützte Abfragehinweise " in diesem Artikel.

[ @query_hint_scope = ] 'replica_group_id'

Standardmäßig ist der Bereich eines neuen Abfragespeicher Hinweis nur das lokale Replikat. @query_hint_scope ist winzig. Dieser optionale Parameter bestimmt den Bereich, in dem der Hinweis auf ein sekundäres Replikat angewendet wird, wenn Abfragespeicher für sekundäre Replikate aktiviert ist. Das optionale query_hint_scope-Argument ist standardmäßig nur für das lokale Replikat (primär oder sekundär) festgelegt, Sie können aber optional eine replica_group_id angeben, die auf sys.query_store_replicas verweist.

Rückgabewert

0 (erfolgreich) oder 1 Fehler.

Hinweise

Hinweise werden als gültige T-SQL-Zeichenfolge im Format N'OPTION (..)' angegeben.

  • Wenn für einen bestimmten @query_idkeine Abfragespeicherhinweise vorhanden sind, wird ein neuer Abfragespeicherhinweis erstellt.
  • Wenn bereits ein Abfragespeicherhinweis für eine bestimmte @query_idvorhanden ist, wird der für @query_hints zuvor angegebene Wert für die zugeordnete Abfrage überschrieben.
  • Wenn kein query_id vorhanden ist, wird ein Fehler ausgelöst.

In dem Fall, in dem ein Hinweis dazu führen würde, dass ein Abfrageplan erstellt wird, werden alle Hinweise ignoriert. Weitere Informationen zu Fehlerdetails finden Sie unter sys.query_store_query_hints.

Um Hinweise zu einer query_id zu entfernen, verwenden Sie die gespeicherte Systemprozedur sys.sp_query_store_clear_hints.

Unterstützte Abfragehinweise

Diese Abfragehinweise werden als Abfragespeicherhinweise unterstützt:

{ HASH | ORDER } GROUP
  | { CONCAT | HASH | MERGE } UNION
  | { LOOP | MERGE | HASH } JOIN
  | EXPAND VIEWS
  | FAST number_rows
  | FORCE ORDER
  | IGNORE_NONCLUSTERED_COLUMNSTORE_INDEX
  | KEEP PLAN
  | KEEPFIXED PLAN
  | MAX_GRANT_PERCENT = percent
  | MIN_GRANT_PERCENT = percent
  | MAXDOP number_of_processors
  | NO_PERFORMANCE_SPOOL
  | OPTIMIZE FOR UNKNOWN
  | PARAMETERIZATION { SIMPLE | FORCED }
  | RECOMPILE
  | ROBUST PLAN
  | USE HINT ( '<hint_name>' [ , ...n ] )

Die folgenden Abfragehinweise werden derzeit nicht unterstützt:

  • OPTIMIZE FOR ( @var = val)
  • MAXRECURSION
  • USE PLAN(Erwägen Sie stattdessen Abfragespeicher den ursprünglichen Plan zur Erzwingung der Funktion sp_query_store_force_plan).
  • DISABLE_DEFERRED_COMPILATION_TV
  • DISABLE_TSQL_SCALAR_UDF_INLINING
  • Tabellenhinweise (z. B. FORCESEEK, READUNCOMMITTED, INDEX)

Berechtigungen

Erfordert die Berechtigung ALTER für die Datenbank.

Beispiele

Identifizieren einer Abfrage im Abfragespeicher

Im folgenden Beispiel werden sys.query_store_query_text und sys.query_store_query abfragen, um die query_id für ein ausgeführtes Abfragetextfragment zurückzugeben.

In diesem Beispiel befindet sich die Abfrage, die wir optimieren möchten, in der Beispieldatenbank SalesLT:

SELECT * FROM SalesLT.Address as A
INNER JOIN SalesLT.CustomerAddress as CA
on A.AddressID = CA.AddressID
WHERE PostalCode = '98052' ORDER BY A.ModifiedDate DESC;

Der Abfragespeicher gibt Abfragedaten nicht sofort an seine Systemsichten zurück.

Identifizieren Sie die Abfrage in den Abfragespeicher-Systemkatalogansichten:

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'%PostalCode =%'
  AND query_sql_text not like N'%query_store%';
GO

In den folgenden Beispielen wurde das vorherige Abfragebeispiel in der SalesLT Datenbank als query_id 39 identifiziert.

Anwenden einzelner Hinweise

Im folgenden Beispiel wird der RECOMPILE-Hinweis auf query_id 39 angewendet, wie in Abfragespeicher identifiziert:

EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE)';

Im folgenden Beispiel wird der Hinweis angewendet, um die Legacy-Kardinalitätsschätzung auf query_id 39 zu erzwingen, die in Abfragespeicher identifiziert werden:

EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';

Anwenden mehrerer Hinweise

Im folgenden Beispiel werden mehrere Abfragehinweise auf query_id 39 angewendet, einschließlich RECOMPILE, MAXDOP 1 und sql 2012-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''))';

Anzeigen von Abfragespeicherhinweisen

Im folgenden Beispiel werden vorhandene Abfragespeicherhinweise zurückgegeben:

SELECT query_hint_id, query_id, query_hint_text, last_query_hint_failure_reason, last_query_hint_failure_reason_desc, query_hint_failure_count, source, source_desc
FROM sys.query_store_query_hints
WHERE query_id = 39;

Entfernen eines Hinweises aus einer Abfrage

Verwenden Sie das folgende Beispiel, um den Hinweis aus query_id 39 mithilfe der gespeicherten sp_query_store_clear_hints Systemprozedur zu entfernen.

EXEC sys.sp_query_store_clear_hints @query_id = 39;