Delen via


sys.sp_query_store_set_hints (Transact-SQL)

van toepassing op: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

Hiermee maakt of werkt u Query Store-hints voor een bepaalde query_id.

Transact-SQL syntaxisconventies

Syntax

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

Arguments

Important

Argumenten voor uitgebreide opgeslagen procedures moeten worden ingevoerd in de specifieke volgorde, zoals beschreven in de sectie Syntaxis. Als de parameters niet in de volgorde zijn ingevoerd, treedt er een foutbericht op.

[ @query_id = ] query_id

De kolom Query Store query_id uit sys.query_store_query.

@query_id is grote.

[ @query_hints = ] N'query_hints'

Een tekenreeks met queryopties die beginnen met OPTION. @query_hints is nvarchar(max).

Wanneer USE HINT het argument is opgenomen @query_hints , moeten de enkele aanhalingstekens rond afzonderlijke hintnamen worden herhaald. Bijvoorbeeld: @query_hints = N'OPTION (MAXDOP = 1, USE HINTS (''ENABLE_QUERY_OPTIMIZER_HOTFIXES'',''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_150''))'.

Zie Ondersteunde queryhints voor meer informatie.

[ @replica_group_id = ] 'replica_group_id'

Deze optionele parameter bepaalt het bereik waarop de hint wordt toegepast op een secundaire replica wanneer Query Store voor leesbare secundaire secundaire bestanden is ingeschakeld. @replica_group_id is bigint.

Het argument @replica_group_id is standaard ingesteld op de lokale replica (primair of secundair), maar u kunt desgewenst een waarde opgeven die overeenkomt met een waarde in de replica_group_id kolom in sys.query_store_replicas om een hint in te stellen voor een andere replicagroep.

Return value

0 (geslaagd) of 1 (mislukt).

Remarks

Hints worden opgegeven in een geldige T-SQL-tekenreeksindeling N'OPTION (..)'.

  • Als er geen Query Store-hints bestaan voor een specifieke @query_id, wordt er een nieuwe Query Store-hint gemaakt.
  • Als er al een Query Store-hint bestaat voor een specifieke @query_id, vervangt de waarde die is opgegeven voor @query_hints de eerder opgegeven hints voor de bijbehorende query vervangt.
  • Als er geen query_id bestaat, wordt er een fout gegenereerd.

In het geval dat een van de hints verhindert dat een queryplan wordt geproduceerd, worden alle hints genegeerd. Zie sys.query_store_query_hintsvoor meer informatie over foutdetails.

Als u hints wilt verwijderen die zijn gekoppeld aan een query_id, gebruikt u de opgeslagen procedure van het systeem sys.sp_query_store_clear_hints.

Ondersteunde queryhints

Deze queryhints worden ondersteund als Query Store-hints:

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

De volgende queryhints worden momenteel niet ondersteund:

  • OPTIMIZE FOR ( @var = val)
  • MAXRECURSION
  • USE PLAN (overweeg in plaats daarvan het oorspronkelijke plan van Query Store, sp_query_store_force_plan).
  • DISABLE_DEFERRED_COMPILATION_TV
  • DISABLE_TSQL_SCALAR_UDF_INLINING
  • Tabelhints (bijvoorbeeld FORCESEEK, READUNCOMMITTED) INDEX

Permissions

Vereist de ALTER machtiging voor de database.

Examples

Een query identificeren in Query Store

In het volgende voorbeeld worden query's sys.query_store_query_text en sys.query_store_query om de query_id te retourneren voor een uitgevoerd querytekstfragment.

In dit voorbeeld bevindt de query die we proberen af te stemmen zich in de SalesLT voorbeelddatabase:

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 geeft niet onmiddellijk querygegevens weer in de systeemweergaven.

Identificeer de query in de systeemcatalogusweergaven van Query Store:

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

In de volgende voorbeelden is het vorige queryvoorbeeld in de SalesLT database geïdentificeerd als query_id 39.

Eén hint toepassen

In het volgende voorbeeld wordt de RECOMPILE hint toegepast op query_id 39, zoals aangegeven in Query Store:

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

In het volgende voorbeeld wordt de hint toegepast om de verouderde kardinaliteitsschatter af te dwingen op query_id 39, geïdentificeerd in Query Store:

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

Meerdere hints toepassen

In het volgende voorbeeld worden meerdere queryhints toegepast op query_id 39, inclusief RECOMPILE, MAXDOP 1en het gedrag van de queryoptimalisatie in compatibiliteitsniveau 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''))';

Query Store-hints weergeven

In het volgende voorbeeld worden bestaande Query Store-hints geretourneerd:

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;

De hint uit een query verwijderen

Gebruik het volgende voorbeeld om de hint uit query_id 39 te verwijderen met behulp van de sp_query_store_clear_hints systeem opgeslagen procedure.

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;