Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
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;