Dela via


sys.sp_query_store_set_hints (Transact-SQL)

gäller för: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

Skapar eller uppdaterar Query Store-tips för en viss query_id.

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

Important

Argument för utökade lagrade procedurer måste anges i den specifika ordning som beskrivs i avsnittet Syntax. Om parametrarna anges i fel ordning visas ett felmeddelande.

[ @query_id = ] query_id

Kolumnen Query Store query_id från sys.query_store_query.

@query_id är bigint.

[ @query_hints = ] N'query_hints'

En teckensträng med frågealternativ som börjar med OPTION. @query_hints är nvarchar(max).

När USE HINT ingår i @query_hints argumentet måste de enskilda citatteckna kring enskilda tipsnamn upprepas. Till exempel @query_hints = N'OPTION (MAXDOP = 1, USE HINTS (''ENABLE_QUERY_OPTIMIZER_HOTFIXES'',''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_150''))'.

Mer information finns i Frågetips som stöds.

[ @replica_group_id = ] "replica_group_id"

Den här valfria parametern avgör omfånget där tipset tillämpas på en sekundär replik när Query Store för läsbara sekundärfiler är aktiverat. @replica_group_id är storint.

Argumentet @replica_group_id är standardinställningen för den lokala repliken (primär eller sekundär), men du kan också ange ett värde som matchar ett värde i replica_group_id kolumnen i sys.query_store_replicas för att ange ett tips för en annan replikgrupp.

Return value

0 (lyckades) eller 1 (fel).

Remarks

Tips anges i ett giltigt T-SQL-strängformat N'OPTION (..)'.

  • Om det inte finns några Query Store-tips för en specifik @query_idskapas ett nytt Query Store-tips.
  • Om det redan finns ett Query Store-tips för en specifik @query_id ersätter värdet som angetts för @query_hints de tidigare angivna tipsen för den associerade frågan.
  • Om det inte finns någon query_id utlöses ett fel.

Om ett av tipsen skulle förhindra att en frågeplan skapas ignoreras alla tips. Mer information om felinformation finns i sys.query_store_query_hints.

Om du vill ta bort tips som är associerade med en query_idanvänder du den system lagrade proceduren sys.sp_query_store_clear_hints.

Frågetips som stöds

Dessa frågetips stöds som Query Store-tips:

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

Följande frågetips stöds för närvarande inte:

  • OPTIMIZE FOR ( @var = val)
  • MAXRECURSION
  • USE PLAN (överväg i stället frågearkivets ursprungliga kapacitet för att tvinga fram planen, sp_query_store_force_plan).
  • DISABLE_DEFERRED_COMPILATION_TV
  • DISABLE_TSQL_SCALAR_UDF_INLINING
  • Tabelltips (till exempel FORCESEEK, READUNCOMMITTED, INDEX)

Permissions

Kräver ALTER behörighet för databasen.

Examples

Identifiera en fråga i Query Store

Följande exempel frågar sys.query_store_query_text och sys.query_store_query för att returnera query_id för ett kört frågetextfragment.

I det här exemplet finns frågan som vi försöker finjustera i SalesLT exempeldatabas:

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;

Query Store återspeglar inte omedelbart frågedata till sina systemvyer.

Identifiera frågan i frågearkivets systemkatalogvyer:

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

I följande exempel identifierades det tidigare frågeexemplet i SalesLT-databasen som query_id 39.

Använd ett tips

I följande exempel tillämpas tipset på query_id 39, enligt beskrivningen RECOMPILE i Query Store:

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

I följande exempel används tipset för att tvinga äldre kardinalitetsestimator till query_id 39, som identifieras i Query Store:

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

Tillämpa flera tips

I följande exempel tillämpas flera frågetips på query_id 39, inklusive RECOMPILE, MAXDOP 1och frågeoptimerarbeteendet på kompatibilitetsnivå 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''))';

Visa tips för Query Store

I följande exempel returneras befintliga Query Store-tips:

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;

Ta bort tipset från en fråga

Använd följande exempel för att ta bort tipset från query_id 39 med hjälp av den sp_query_store_clear_hints system lagrade proceduren.

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;