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

Syntaxis

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

Argumenten

Belangrijk

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). Zie Ondersteunde queryhints in dit artikel voor meer informatie.

[ @query_hint_scope = ] 'replica_group_id'

Standaard is het bereik van een nieuwe Query Store-hint alleen de lokale replica. @query_hint_scope is klein. Deze optionele parameter bepaalt het bereik waarop de hint wordt toegepast op een secundaire replica wanneer Query Store voor secundaire replica's is ingeschakeld. Het optionele query_hint_scope argument wordt alleen standaard ingesteld op de lokale replica (primair of secundair), maar u kunt desgewenst een replica_group_id opgeven waarnaar sys.query_store_replicasverwijst.

Retourwaarde

0 (geslaagd) of 1 (mislukt).

Opmerkingen

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, wordt de waarde die is opgegeven voor @query_hints eerder opgegeven hints voor de bijbehorende query overschreven.
  • 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:

Machtigingen

Hiervoor is de machtiging ALTER vereist voor de database.

Voorbeelden

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

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 hint RECOMPILE toegepast op query_id 39, zoals aangegeven in Query Store:

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

EXEC 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, waaronder RECOMPILE, MAXDOP 1 en het gedrag van de SQL 2012-queryoptimalisatie:

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

EXEC sys.sp_query_store_clear_hints @query_id = 39;