sys.sp_query_store_set_hints (Transact-SQL)

适用于:SQL Server 2022 (16.x) Azure SQL 数据库 Azure SQL 托管实例

为给定query_id创建或更新查询存储提示

Transact-SQL 语法约定

语法

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_hintsnvarchar(max)。 有关详细信息,请参阅 本文中支持的查询提示

[ @query_hint_scope = ] 'replica_group_id'

默认情况下,新查询存储提示的范围仅为本地副本。 @query_hint_scope。 此可选参数确定启用辅助副本查询存储时,提示将应用于次要副本的范围。 可选 query_hint_scope 参数仅默认为本地副本(主副本或辅助副本),但可以选择指定 引用sys.query_store_replicas replica_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 ] )

目前不支持以下查询提示:

权限

需要对数据库拥有 ALTER 权限。

示例

在查询存储中标识查询

以下示例查询 sys.query_store_query_textsys.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 ,数据库中的上一个查询示例被标识为 39 query_id

应用单一提示

以下示例将 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 系统存储过程从 query_id 39 中删除提示。

EXEC sys.sp_query_store_clear_hints @query_id = 39;