Sdílet prostřednictvím


sys.sp_query_store_set_hints (Transact-SQL)

platí pro: SQL Server 2022 (16.x) azure SQL Databaseazure SQL Managed Instance

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'
    [ , [ @query_hint_scope = ] 'replica_group_id' ]
[ ; ]

Argumenty

Důležité

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). Další informace najdete v tématu Podporované nápovědy k dotazům v tomto článku.

[ @query_hint_scope = ] 'replica_group_id'

Ve výchozím nastavení je obor nového úložiště dotazů pouze místní replika. @query_hint_scope je tinyint. Tento volitelný parametr určuje obor, při kterém bude tip použit na sekundární replice, pokud je povolené úložiště dotazů pro sekundární repliky. Volitelný argument query_hint_scope je výchozí pouze pro místní repliku (primární nebo sekundární), ale volitelně můžete zadat replica_group_id odkazující na sys.query_store_replicas.

Návratová hodnota

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

Poznámky

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_idexistuje, hodnota zadaná pro @query_hints přepíše 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:

Dovolení

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

Příklady

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 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

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 aplikuje nápovědu RECOMPILE na query_id 39, jak je uvedeno v úložišti dotazů:

EXEC 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ů:

EXEC 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á několik tipů dotazu na query_id 39, včetně RECOMPILE, MAXDOP 1 a chování optimalizátoru dotazů 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''))';

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, 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.

EXEC sys.sp_query_store_clear_hints @query_id = 39;