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

Syntax

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

Arguments

Important

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

Quando USE HINT viene incluso nell'argomento @query_hints , le virgolette singole intorno ai singoli nomi di hint devono essere ripetute. Ad esempio: @query_hints = N'OPTION (MAXDOP = 1, USE HINTS (''ENABLE_QUERY_OPTIMIZER_HOTFIXES'',''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_150''))'.

Per altre informazioni, vedere Hint di query supportati.

[ @replica_group_id = ] 'replica_group_id'

Questo parametro facoltativo determina l'ambito in cui l'hint viene applicato a una replica secondaria quando Query Store è abilitato per repliche secondarie leggibili . @replica_group_id è bigint.

L'argomento @replica_group_id viene impostato per impostazione predefinita sulla replica locale (primaria o secondaria), ma facoltativamente è possibile specificare un valore corrispondente a un valore nella replica_group_id colonna in sys.query_store_replicas per impostare un hint per un gruppo di repliche diverso.

Return value

0 (esito positivo) o 1 (errore).

Remarks

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 un @query_id specifico, il valore specificato per @query_hints sostituisce gli hint specificati in precedenza per la query associata.
  • Se non esiste un query_id , viene 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:

  • OPTIMIZE FOR ( @var = val)
  • MAXRECURSION
  • USE PLAN Si consideri invece la funzionalità di forzatura del piano originale di Query Store, sp_query_store_force_plan).
  • DISABLE_DEFERRED_COMPILATION_TV
  • DISABLE_TSQL_SCALAR_UDF_INLINING
  • Hint di tabella (ad esempio, FORCESEEK, READUNCOMMITTED, INDEX)

Permissions

È richiesta l'autorizzazione ALTER per il database.

Examples

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

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:

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

EXECUTE 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 1e il comportamento di Query Optimizer nel livello di compatibilità 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''))';

Visualizzare gli hint di Query Store

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

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;

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 .

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;