Sdílet prostřednictvím


sys.sp_query_store_set_hints (Transact-SQL)

Platí pro: SQL Server 2022 (16.x) a novější verze databáze SQL Azure SQL DatabaseAzure SQL Managed Instancev Microsoft Fabric

Vytvoří nebo aktualizuje nápovědy úložiště dotazů pro danou query_id.

Transact-SQL konvence syntaxe

Syntax

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

Arguments

Important

Argumenty rozšířených uložených procedur musí být zadány v určitém pořadí, jak je popsáno v části Syntaxe. Pokud jsou parametry zadány mimo pořadí, dojde k chybové zprávě.

[ @query_id = ] query_id

Sloupec úložiště dotazů query_id ze sys.query_store_query.

@query_id je bigint.

[ @query_hints = ] N'query_hints'

Znakový řetězec možností dotazu začínající OPTION. @query_hints je nvarchar(max).

Pokud USE HINT je součástí argumentu @query_hints , musí se opakovat jednoduché uvozovky kolem názvů jednotlivých tipů. Například: @query_hints = N'OPTION (MAXDOP = 1, USE HINTS (''ENABLE_QUERY_OPTIMIZER_HOTFIXES'',''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_150''))'.

Další informace naleznete v tématu Podporované nápovědy k dotazům.

[ @replica_group_id = ] 'replica_group_id'

Tento volitelný parametr určuje obor, při kterém se nápověda použije na sekundární replice, pokud je povolené úložiště dotazů pro čitelné sekundy . @replica_group_id je velký. Úložiště dotazů pro sekundární repliky je podporováno od SQL Server 2025 (17.x) a novějších verzí, stejně jako v Azure SQL Database. Pro kompletní podporu platformy viz Query Store pro sekundární repliky.

Argument @replica_group_id výchozí hodnotu místní repliky (primární nebo sekundární), ale volitelně můžete zadat hodnotu odpovídající hodnotě ve replica_group_id sloupci v sys.query_store_replicas a nastavit nápovědu pro jinou skupinu replik.

Návratová hodnota

0 (úspěch) nebo 1 (selhání).

Remarks

Nápovědy jsou zadány v platném formátu řetězce T-SQL N'OPTION (..)'.

  • Pokud pro konkrétní @query_idneexistují žádné rady úložiště dotazů, vytvoří se nový tip úložiště dotazů.
  • Pokud již nápovědu úložiště dotazů pro konkrétní @query_id existuje, hodnota zadaná pro @query_hints nahradí dříve zadané rady pro přidružený dotaz.
  • Pokud query_id neexistuje, vyvolá se chyba.

V případě, že by jeden z tipů zabránil vytvoření plánu dotazu, budou všechny rady ignorovány. Další informace o podrobnostech o selhání najdete v tématu sys.query_store_query_hints.

Chcete-li odebrat nápovědy spojené s query_id, použijte systém uloženou proceduru sys.sp_query_store_clear_hints.

Podporované nápovědy k dotazům

Tyto nápovědy k dotazům jsou podporované jako rady úložiště dotazů:

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

V současné době nejsou podporovány následující nápovědy k dotazům:

  • OPTIMIZE FOR ( @var = val)
  • MAXRECURSION
  • USE PLAN (místo toho zvažte možnost vynucení původního plánu úložiště dotazů sp_query_store_force_plan).
  • DISABLE_DEFERRED_COMPILATION_TV
  • DISABLE_TSQL_SCALAR_UDF_INLINING
  • Rady k tabulce (například FORCESEEK, READUNCOMMITTED, INDEX)

Permissions

Vyžaduje oprávnění ALTER k databázi.

Examples

Identifikace dotazu v úložišti dotazů

Následující příklad dotazů sys.query_store_query_text a sys.query_store_query k vrácení query_id pro fragment textu spuštěného dotazu.

V tomto příkladu je dotaz, který se pokoušíme vyladit, v ukázkové databázi 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;

Úložiště dotazů okamžitě neodráží data dotazů do systémových zobrazení.

Identifikujte dotaz v zobrazeních systémového katalogu úložiště dotazů:

SELECT q.query_id,
       qt.query_sql_text
FROM sys.query_store_query_text AS qt
     INNER JOIN sys.query_store_query AS 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

V následujících ukázkách byl předchozí příklad dotazu v databázi SalesLT identifikován jako query_id 39.

Použití jediné nápovědy

Následující příklad použije nápovědu RECOMPILE pro query_id 39, jak je uvedeno v úložišti dotazů:

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

Následující příklad použije nápovědu k vynucení staršího nástroje pro posouzení kardinality na query_id 39 identifikovaných v úložišti dotazů:

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

Použití více tipů

Následující příklad používá více tipů dotazu na query_id 39, včetně RECOMPILE, MAXDOP 1a chování optimalizátoru dotazů v úrovni kompatibility 110:

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

Zobrazení nápovědy k úložišti dotazů

Následující příklad vrátí existující rady úložiště dotazů:

SELECT query_hint_id,
       query_id,
       replica_group_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;

Odebrání nápovědy z dotazu

Pomocí následujícího příkladu odeberte nápovědu z query_id 39 pomocí uložené procedury sp_query_store_clear_hints systému.

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;