Condividi tramite


sys.sp_query_store_set_hints (Transact-SQL)

Si applica a: SQL Server 2022 (16.x) Database Azure SQLIstanza gestita di SQL di Azure

Crea o aggiorna gli hint di Query Store per un determinato query_id.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

Importante

Gli argomenti per le stored procedure estese devono essere immessi nell'ordine specifico, come descritto nella sezione Sintassi. Se i parametri vengono immessi in ordine non corretto, si verifica un messaggio di errore.

[ @query_id = ] query_id

Colonna query store query_id da sys.query_store_query. @query_id è bigint.

[ @query_hints = ] N'query_hints'

Stringa di caratteri delle opzioni di query che iniziano con OPTION. @query_hints è nvarchar(max). Per altre informazioni, vedere Hint di query supportati in questo articolo.

[ @query_hint_scope = ] 'replica_group_id'

Per impostazione predefinita, l'ambito di un nuovo hint di Query Store è solo la replica locale. @query_hint_scope è tinyint. Questo parametro facoltativo determina l'ambito in cui verrà applicato l'hint in una replica secondaria quando Query Store per le repliche secondarie è abilitato. L'argomento facoltativo query_hint_scope viene impostato per impostazione predefinita solo sulla replica locale (primaria o secondaria), ma facoltativamente è possibile specificare un replica_group_id che fa riferimento sys.query_store_replicas.

Valore restituito

0 (esito positivo) o 1 (errore).

Osservazioni:

Gli hint vengono specificati in un formato N'OPTION (..)'di stringa T-SQL valido.

  • Se non esistono hint per Query Store per un @query_idspecifico, viene creato un nuovo hint di Query Store.
  • Se esiste già un hint di Query Store per una specifica @query_id, il valore specificato per @query_hints esegue l'override degli hint specificati in precedenza per la query associata.
  • Se non esiste un query_id , verrà generato un errore.

Nel caso in cui uno degli hint impedisca la produzione di un piano di query, tutti gli hint vengono ignorati. Per altre informazioni sui dettagli sull'errore, vedere sys.query_store_query_hints.

Per rimuovere gli hint associati a un query_id, usare la stored procedure di sistema sys.sp_query_store_clear_hints.

Hint per la query supportati

Questi hint per la query sono supportati come hint di Query Store:

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

Gli hint per la query seguenti non sono attualmente supportati:

Autorizzazioni

È necessaria l'autorizzazione ALTER per il database.

Esempi

Identificare una query in Query Store

Nell'esempio seguente vengono eseguite query sys.query_store_query_text e sys.query_store_query per restituire il query_id per un frammento di testo della query eseguito.

In questo esempio la query che si sta tentando di ottimizzare è nel SalesLT database di esempio:

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 non riflette immediatamente i dati delle query nelle viste di sistema.

Identificare la query nelle viste del catalogo di sistema di 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

Negli esempi seguenti, l'esempio di query precedente nel SalesLT database è stato identificato come query_id 39.

Applica suggerimento singolo

L'esempio seguente applica l'hint RECOMPILE a query_id 39, come identificato in Query Store:

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

L'esempio seguente applica l'hint per forzare lo strumento di stima della cardinalità legacy a query_id 39, identificato in Query Store:

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

Applicare più hint

L'esempio seguente applica più hint di query a query_id 39, tra cui RECOMPILE, MAXDOP 1 e il comportamento di Query Optimizer di 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''))';

Visualizzare gli hint di Query Store

L'esempio seguente restituisce gli hint di Query Store esistenti:

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;

Rimuovere l'hint da una query

Usare l'esempio seguente per rimuovere l'hint da query_id 39, usando la stored procedure di sistema sp_query_store_clear_hints .

EXEC sys.sp_query_store_clear_hints @query_id = 39;