Udostępnij za pośrednictwem


sys.sp_query_store_set_hints (Transact-SQL)

Dotyczy: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

Tworzy lub aktualizuje wskazówki dotyczące magazynu zapytań dla danego query_id.

Transact-SQL konwencje składni

Składnia

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

Argumenty

Ważne

Argumenty dla rozszerzonych procedur składowanych należy wprowadzić w określonej kolejności zgodnie z opisem w sekcji składni. Jeśli parametry są wprowadzane poza kolejnością, wystąpi komunikat o błędzie.

[ @query_id = ] query_id

Kolumna magazynu zapytań query_id z sys.query_store_query. @query_id jest bigint.

[ @query_hints = ] N'query_hints'

Ciąg znaków opcji zapytania rozpoczynający się od OPTION. @query_hints to nvarchar(max). Aby uzyskać więcej informacji, zobacz Obsługiwane wskazówki dotyczące zapytań w tym artykule.

[ @query_hint_scope = ] 'replica_group_id'

Domyślnie zakres nowej wskazówki magazynu zapytań jest tylko repliką lokalną. @query_hint_scope jest tinyint. Ten opcjonalny parametr określa zakres, w którym wskazówka zostanie zastosowana w repliki pomocniczej po włączeniu magazynu zapytań dla replik pomocniczych. Opcjonalny argument query_hint_scope jest domyślny tylko dla repliki lokalnej (podstawowej lub pomocniczej), ale opcjonalnie można określić replica_group_id odwołującą się do sys.query_store_replicas.

Wartość zwracana

0 (powodzenie) lub 1 (niepowodzenie).

Uwagi

Wskazówki są określone w prawidłowym formacie ciągu języka T-SQL N'OPTION (..)'.

  • Jeśli dla określonego @query_idnie istnieją żadne wskazówki dotyczące magazynu zapytań, zostanie utworzona nowa wskazówka magazynu zapytań.
  • Jeśli wskazówka magazynu zapytań już istnieje dla określonego @query_id, wartość określona dla @query_hints zastępuje wcześniej określone wskazówki dla skojarzonego zapytania.
  • Jeśli query_id nie istnieje, zostanie zgłoszony błąd.

W przypadku, gdy jedna z wskazówek uniemożliwiłaby utworzenie planu zapytania, wszystkie wskazówki są ignorowane. Aby uzyskać więcej informacji o błędach, zobacz sys.query_store_query_hints.

Aby usunąć wskazówki skojarzone z query_id, użyj systemowej procedury składowanej sys.sp_query_store_clear_hints.

Obsługiwane wskazówki dotyczące zapytań

Te wskazówki dotyczące zapytań są obsługiwane jako wskazówki dotyczące magazynu zapytań:

{ 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 ] )

Następujące wskazówki dotyczące zapytań są obecnie nieobsługiwane:

Uprawnienia

Wymaga uprawnienia ALTER w bazie danych.

Przykłady

Identyfikowanie zapytania w magazynie zapytań

Poniższe przykładowe zapytania sys.query_store_query_text i sys.query_store_query, aby zwrócić query_id dla wykonanego fragmentu tekstu zapytania.

W tym przykładzie zapytanie, które próbujemy dostroić, znajduje się w przykładowej bazie danych 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;

Magazyn zapytań nie odzwierciedla natychmiast danych zapytania w widokach systemowych.

Zidentyfikuj zapytanie w widokach wykazu systemu magazynu zapytań:

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

W poniższych przykładach poprzedni przykład zapytania w bazie danych SalesLT został zidentyfikowany jako query_id 39.

Stosowanie pojedynczej wskazówki

Poniższy przykład stosuje wskazówkę RECOMPILE do query_id 39, jak określono w magazynie zapytań:

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

Poniższy przykład stosuje wskazówkę, aby wymusić starszego narzędzia do szacowania kardynalności do query_id 39 zidentyfikowanych w magazynie zapytań:

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

Stosowanie wielu wskazówek

Poniższy przykład stosuje wiele wskazówek dotyczących zapytań do query_id 39, w tym RECOMPILE, MAXDOP 1 i zachowanie optymalizatora zapytań SQL 2012:

EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1, USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_110''))';

Wyświetlanie wskazówek dotyczących magazynu zapytań

Poniższy przykład zwraca istniejące wskazówki dotyczące magazynu zapytań:

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;

Usuwanie wskazówki z zapytania

Użyj poniższego przykładu, aby usunąć wskazówkę z query_id 39 przy użyciu procedury składowanej systemu sp_query_store_clear_hints.

EXEC sys.sp_query_store_clear_hints @query_id = 39;