Freigeben über


sys.sp_query_store_set_hints (Transact-SQL)

Gilt für: SQL Server 2022 (16.x) Azure SQL-Datenbank Azure 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

[ @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_id kein Abfragespeicher Hinweis vorhanden ist, wird ein neuer Abfragespeicher Hinweis erstellt.
  • Wenn ein Abfragespeicher Hinweis bereits für eine bestimmte query_id vorhanden ist, überschreibt der letzte angegebene Wert zuvor angegebene Werte für die zugeordnete Abfrage.
  • Wenn kein query_id vorhanden ist, wird ein Fehler ausgelöst.

Sollte ein Hinweis zu einem Fehler in der Abfrageausführung führen, wird er ignoriert. Die aktuellen Fehlerdetails werden dann in sys.query_store_query_hints angezeigt.

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 Systemkatalogsichten des Abfragespeichers:

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;