sys.sp_query_store_set_hints (Transact-SQL)
Si applica a: SQL Server 2022 (16.x)
Database Azure SQL
Istanza 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:
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)
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;