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 Abfragespeicherhinweise für eine bestimmte query_id.

ThemenlinksymbolTransact-SQL-Syntaxkonventionen

Syntax

sp_query_store_set_hints
    @query_id = 'query_id',
    @query_hints = 'query_hints'
    [, @query_hints_comment = 'query_hints_comment' ]
    [, @override_plan_guide_and_hints = 'override_plan_guide_and_hints' ]
    [, @fail_execution_on_error = 'fail_execution_on_error' ]
    [, @query_hint_scope = 'query_hint_scope' ] [;]  

Argumente

@query_id

Bigint. Erforderlich. Die Abfragespeicher query_id von sys.query_store_query.

@query_hints

Nvarchar(max). Zeichenfolge von Abfrageoptionen ab 'OPTION. Weitere Informationen finden Sie unter Unterstützte Abfragehinweise in diesem Artikel.

[ @query_hints_comment ]

Nvarchar(max). Benutzerbearbeitbarer Kommentar zu Abfragehinweisen. Verwenden Sie diese Option, um Kontext, Anwendung, Ereignis oder andere Informationen bereitzustellen, die für Sie selbst und andere Administratoren in zukunft nützlich sind.

[ @override_plan_guide_and_hints ]

Bit. Wird standardmäßig auf 1 festgelegt. Steuert, ob der neue Abfragespeicher Hinweis eine vorhandene Plananleitung oder einen direkten Hinweis im Code überschreibt.

[ @fail_execution_on_error ]

Bit. Der Standardwert ist 0. Steuert, ob Fehler beim Anwenden eines Abfragehinweises auf den Client angezeigt werden. Die Standardeinstellung für dieses Argument entspricht 0 dem vorhandenen Abfragespeicher Plan, der das Gesamtverhalten erzwingt, bei dem fehlerlose Vorgänge unbeaufsichtigt protokolliert werden und die Abfrageausführung nicht blockieren.

[ @query_hint_scope ]

Tinyint. Standardmäßig ist der Bereich eines neuen Abfragespeicher Hinweis nur das lokale Replikat. Bestimmt den Bereich, in dem der Hinweis angewendet wird, gemäß der replica_group_id Spalte in sys.query_store_replicas.

Rückgabewerte

„0“ (erfolgreich) oder „1“ (fehlerhaft)

Bemerkungen

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

  • Ist für eine bestimmte query_id kein Abfragespeicherhinweis vorhanden, wird ein neuer erstellt.
  • Ist für eine bestimmte query_id bereits ein Abfragespeicherhinweis vorhanden, überschreibt der letzte angegebene Wert frühere Werte für die entsprechende Abfrage.
  • Ist keine query_id vorhanden, 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 einer 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:

Berechtigungen

Erfordert die ALTER-Berechtigung für die Datenbank.

Beispiele

Identifizieren einer Abfrage im Abfragespeicher

Im folgenden Beispiel werden die Abfragen sys.query_store_query_text und sys.query_store_query ausgeführt, um die query_id für ein ausgeführtes Abfragetextfragment zu erhalten.

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;

Beachten Sie, dass der Abfragespeicher Abfragedaten nicht sofort in den Systemsichten widerspiegelt.

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 Datenbank SalesLT als query_id 39 identifiziert.

Anwenden einzelner Hinweise

Das folgende Beispiel wendet den Hinweis RECOMPILE auf die query_id 39 an, wie im Abfragespeicher identifiziert:

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

Das folgenden Beispiel wendet den Hinweis an, um die Legacykardinalitätsschätzung für query_id 39 zu erzwingen, wie im Abfragespeicher identifiziert:

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

Anwenden mehrerer Hinweise

Das folgende Beispiel wendet mehrere Abfragehinweise auf query_id 39 an, einschließlich RECOMPILE, MAXDOP 1 und des Verhaltens des SQL 2012-Abfrageoptimierers:

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 der query_id 39 zu entfernen, indem Sie die gespeicherte Systemprozedur sp_query_store_clear_hints (Transact-SQL) verwenden.

EXEC sys.sp_query_store_clear_hints @query_id = 39;

Nächste Schritte