sp_query_store_set_hints (Transact-SQL)
Si applica a: SQL Server 2022 (16.x) DatabaseSQL di Azure Istanza gestita di SQL di Azure
Crea o aggiorna gli hint di Query Store per un determinato query_id.
Convenzioni di sintassi Transact-SQL
Sintassi
sp_query_store_set_hints
[ @query_id = ] query_id ,
[ @query_hints = ] 'query_hints'
[ , [ @query_hint_scope = ] 'replica_group_id' ]
[ ; ]
Argomenti
[ @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.
Valori restituiti
0
(esito positivo) o 1
(errore).
Osservazioni:
Gli hint vengono specificati in un formato N'OPTION (..)'
di stringa T-SQL valido.
- Se non esiste alcun hint di Query Store per un query_id specifico, verrà creato un nuovo hint di Query Store.
- Se esiste già un hint di Query Store per un query_id specifico, l'ultimo valore specificato sostituirà i valori specificati in precedenza per la query associata.
- Se non esiste un query_id , verrà generato un errore.
Nei casi in cui un hint provocherebbe un errore di una query, l'hint viene ignorato e i dettagli dell'errore più recenti possono essere visualizzati in 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 dell'archivio query:
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 (Transact-SQL).
EXEC sys.sp_query_store_clear_hints @query_id = 39;