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 eine bestimmte 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 spalte Abfragespeicher query_id
aus sys.query_store_query. @query_id ist bigint.
[ @query_hints = ] N'query_hints'
Eine Zeichenfolge von Abfrageoptionen, die mit 'OPTION
beginnen. @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 tinyint. 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 argument query_hint_scope ist standardmäßig nur auf das lokale Replikat (primäres oder sekundäres Replikat) festgelegt, aber Sie können optional einen replica_group_id angeben, der auf sys.query_store_replicas verweist.
Rückgabewerte
0
(Erfolg) oder 1
(Fehler).
Bemerkungen
Hinweise werden als gültige T-SQL-Zeichenfolge im Format N'OPTION (..)'
angegeben.
- Wenn für eine bestimmte query_id kein Abfragespeicher Hinweis vorhanden ist, wird ein neuer Abfragespeicher-Hinweis erstellt.
- Wenn für eine bestimmte query_id bereits ein Abfragespeicher Hinweis vorhanden ist, überschreibt der zuletzt 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.
Verwenden Sie zum Entfernen von Hinweisen, die einem query_id zugeordnet sind, 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
(Betrachten Sie stattdessen die ursprüngliche Planerzwingungsfunktion von Abfragespeicher, sp_query_store_force_plan).DISABLE_DEFERRED_COMPILATION_TV
DISABLE_TSQL_SCALAR_UDF_INLINING
- Tabellenhinweise (z. B. FORCESEEK, READUNCOMMITTED, INDEX)
Berechtigungen
Erfordert die ALTER-Berechtigung für die Datenbank.
Beispiele
Identifizieren einer Abfrage im Abfragespeicher
Im folgenden Beispiel werden Abfragen sys.query_store_query_text und sys.query_store_query , 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;
Abfragespeicher spiegelt Abfragedaten nicht sofort in seinen Systemsichten wider.
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 angegeben:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE)';
Im folgenden Beispiel wird der Hinweis angewendet, um die ältere 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 dem 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
Das folgende Beispiel gibt vorhandene Abfragespeicherhinweise zurück:
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 Systemprozedur sp_query_store_clear_hints (Transact-SQL) zu entfernen.
EXEC sys.sp_query_store_clear_hints @query_id = 39;