sp_query_store_set_hints (Transact-SQL)
适用于: SQL Server 2022 (16.x) Azure SQL 数据库Azure SQL 托管实例
为给定query_id创建或更新查询存储提示。
语法
sp_query_store_set_hints
[ @query_id = ] query_id ,
[ @query_hints = ] 'query_hints'
[ , [ @query_hint_scope = ] 'replica_group_id' ]
[ ; ]
参数
[ @query_id = ] query_id
sys.query_store_query中的查询存储query_id
列。 @query_id是大。
[ @query_hints = ] N'query_hints'
以 开头 'OPTION
的查询选项的字符串。 @query_hints 为 nvarchar (max) 。 有关详细信息,请参阅本文中 支持的查询提示 。
[ @query_hint_scope = ] 'replica_group_id'
默认情况下,新查询存储提示的作用域仅为本地副本 (replica) 。 @query_hint_scope 是 微小的。 此可选参数确定启用辅助副本查询存储时,将在次要副本 (replica) 上应用提示的范围。 可选的 query_hint_scope 参数默认为本地副本 (replica) (主) 或辅助) ,但可以选择指定引用sys.query_store_replicasreplica_group_id。
返回值
0
(成功) 或 1
(失败) 。
备注
在有效 T-SQL 字符串格式 N'OPTION (..)'
中指定提示。
- 如果特定query_id不存在查询存储提示,则将创建新的查询存储提示。
- 如果特定query_id已存在查询存储提示,则提供的最后一个值将替代以前为关联查询指定的值。
- 如果 query_id 不存在,将引发错误。
如果提示导致查询失败,则会忽略提示,并可在 sys.query_store_query_hints 中查看最新的失败详细信息。
若要删除 与query_id关联的提示,请使用系统存储过程 sys.sp_query_store_clear_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 ] )
目前不支持以下查询提示:
OPTIMIZE FOR ( @var = val)
MAXRECURSION
USE PLAN
(,请考虑查询存储的原始计划强制能力,sp_query_store_force_plan) 。DISABLE_DEFERRED_COMPILATION_TV
DISABLE_TSQL_SCALAR_UDF_INLINING
- 表提示(例如 FORCESEEK、READUNCOMMITTED、INDEX)
权限
需要具有针对数据库的 ALTER 权限。
示例
在查询存储中标识查询
以下示例 查询sys.query_store_query_text 并 sys.query_store_query 返回已执行的查询文本片段 的query_id 。
在此示例中,我们尝试优化的查询位于 SalesLT
示例数据库中:
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;
查询存储不会立即将查询数据反映到其系统视图。
在查询存储系统目录视图中标识查询:
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
在以下示例中 SalesLT
,数据库中的上一个查询示例被标识为 query_id 39。
应用单一提示
以下示例将 RECOMPILE 提示应用于 query_id 39,如 查询存储 中所示:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(RECOMPILE)';
以下示例应用提示以强制旧基数估算器query_id 39,查询存储中标识:
EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''FORCE_LEGACY_CARDINALITY_ESTIMATION''))';
应用多个提示
以下示例将多个查询提示应用于 query_id 39,包括 RECOMPILE、MAXDOP 1 和 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''))';
查看查询存储提示
以下示例返回现有查询存储提示:
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;
从查询移除提示
使用以下示例,使用 sp_query_store_clear_hints (Transact-SQL ) 系统存储过程从 query_id 39 中删除提示。
EXEC sys.sp_query_store_clear_hints @query_id = 39;