sys.dm_db_missing_index_group_stats_query (Transact-SQL)
适用于:SQL Server 2019 (15.x) Azure SQL 数据库Azure SQL 托管实例
返回有关需要缺少索引组(不包括空间索引)的查询的信息。 每个缺失的索引组可以返回多个查询。 一个缺少的索引组可能有多个查询需要同一索引。
在 Azure SQL 数据库中,动态管理视图不能公开将影响数据库包含的信息,也不能公开有关用户可以访问的其他数据库的信息。 为了避免暴露此信息,包含不属于所连接租户的数据的每行都会被筛选出。
列名称 | 数据类型 | 描述 |
---|---|---|
group_handle | int | 标识缺失索引组。 此标识符在服务器中是唯一的。 其他列提供有关组中的索引被视为缺失的所有查询的信息。 一个索引组仅包含一个索引。 可以加入 index_group_handle sys.dm_db_missing_index_groups。 |
query_hash | binary(8) | 对查询计算的二进制哈希值,用于标识具有类似逻辑的查询。 可以使用查询哈希确定仅仅是文字值不同的查询的聚合资源使用情况。 |
query_plan_hash | binary(8) | 对查询执行计划计算的二进制哈希值,用于标识类似的查询执行计划。 可以使用查询计划哈希查找具有类似执行计划的查询的累积成本。 当本机编译的存储过程查询内存优化的表时,此项将始终为 0x000。 |
last_sql_handle | varbinary(64) | 唯一标识需要此索引的最后一个编译语句的批处理或存储过程的标记。last_sql_handle 可以通过调用动态管理功能sys.dm_exec_sql_text来检索查询的 SQL 文本。 |
last_statement_start_offset | int | 指示行在其批处理的文本中描述的查询的起始位置(以字节为单位)或最后一个编译语句(在其 SQL 批处理中需要此索引)的持久对象文本中的起始位置。 |
last_statement_end_offset | int | 指示行在其批处理的文本中描述的查询的结束位置(以字节为单位)或最后一个编译语句(在其 SQL 批处理中需要此索引)的持久化语句的文本中的结束位置。 |
last_statement_sql_handle | varbinary(64) | 唯一标识需要此索引的最后一个编译语句的批处理或存储过程的标记。 由查询存储使用。 sys.query_store_query_text 与查询存储目录视图sys.query_store_query_text使用的引用statement_sql_handle 不同last_sql_handle 。如果在编译查询时未启用查询存储,则返回 0。 |
user_seeks | bigint | 由可能使用了组中建议索引的用户查询所导致的查找次数。 |
user_scans | bigint | 由可能使用了组中建议索引的用户查询所导致的扫描次数。 |
last_user_seek | datetime | 由可能使用了组中建议索引的用户查询所导致的上次查找日期和时间。 |
last_user_scan | datetime | 由可能使用了组中建议索引的用户查询所导致的上次扫描日期和时间。 |
avg_total_user_cost | float | 可通过组中的索引减少的用户查询的平均成本。 |
avg_user_impact | float | 实现此缺失索引组后,用户查询可能获得的平均百分比收益。 该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。 |
system_seeks | bigint | 由可能使用了组中建议索引的系统查询(如自动统计信息查询)所导致的查找次数。 有关详细信息,请参阅 自动统计信息事件类。 |
system_scans | bigint | 由可能使用了组中建议索引的系统查询所导致的扫描次数。 |
last_system_seek | datetime | 由可能使用了组中建议索引的系统查询所导致的上次系统查找日期和时间。 |
last_system_scan | datetime | 由可能使用了组中建议索引的系统查询所导致的上次系统扫描日期和时间。 |
avg_total_system_cost | float | 可通过组中的索引减少的系统查询的平均成本。 |
avg_system_impact | float | 实现此缺失索引组后,系统查询可能获得的平均百分比收益。 该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。 |
注解
每个 sys.dm_db_missing_index_group_stats_query
查询执行(而不是每个查询编译或重新编译)返回的信息都会更新。 使用情况统计信息不会持久保存,并且仅在重启数据库引擎之前保留。
如果数据库管理员要在服务器回收后保留使用情况统计信息,则应该定期制作缺失索引信息的备份副本。 使用 sys.dm_os_sys_info 中的 sqlserver_start_time
列查找上次数据库引擎启动时间。 还可以使用查询存储保留缺失的索引。
注意
此 DMV 的结果集限制为 600 行。 每行包含一个缺失的索引。 如果缺少的索引超过 600 个,则应解决现有的缺失索引,以便查看较新的索引。
权限
若要查询此动态管理视图,必须授予用户 VIEW SERVER STATE 权限或隐含 VIEW SERVER STATE 权限的任何权限。
SQL Server 2022 及更高版本的权限
要求对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。
示例
以下示例演示如何使用 sys.dm_db_missing_index_group_stats_query
动态管理视图。
A. 查找用户查询前 10 个最高预期改进的最新查询文本
以下查询返回 10 个缺失索引的最后一个记录查询文本,这些索引将按降序生成最高预期累积改进。
SELECT TOP 10
SUBSTRING
(
sql_text.text,
misq.last_statement_start_offset / 2 + 1,
(
CASE misq.last_statement_start_offset
WHEN -1 THEN DATALENGTH(sql_text.text)
ELSE misq.last_statement_end_offset
END - misq.last_statement_start_offset
) / 2 + 1
),
misq.*
FROM sys.dm_db_missing_index_group_stats_query AS misq
CROSS APPLY sys.dm_exec_sql_text(misq.last_sql_handle) AS sql_text
ORDER BY misq.avg_total_user_cost * misq.avg_user_impact * (misq.user_seeks + misq.user_scans) DESC;
后续步骤
在以下文章中详细了解缺少的索引功能和相关概念:
- 使用缺失索引建议优化非聚集索引
- sys.dm_db_missing_index_columns (Transact-SQL)
- sys.dm_db_missing_index_details (Transact-SQL)
- sys.dm_db_missing_index_groups (Transact-SQL)
- sys.dm_db_missing_index_group_stats (Transact-SQL)
- sys.dm_exec_sql_text (Transact-SQL)
- CREATE INDEX (Transact-SQL)
- sys.dm_os_sys_info (Transact-SQL)
- 查询存储