sys.dm_db_missing_index_group_stats (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例

返回缺失索引组的摘要信息,不包括空间索引。

在 Azure SQL 数据库中,动态管理视图不能公开将影响数据库包含的信息,也不能公开有关用户可以访问的其他数据库的信息。 为了避免暴露此信息,包含不属于所连接租户的数据的每行都会被筛选出。

列名称 数据类型 描述
group_handle int 标识缺失索引组。 此标识符在服务器中是唯一的。

其他列提供有关组中的索引被视为缺失的所有查询的信息。

一个索引组仅包含一个索引。

可以加入 index_group_handle sys.dm_db_missing_index_groups
unique_compiles bigint 将从该缺失索引组受益的编译和重新编译数。 许多不同查询的编译和重新编译可影响该列值。
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 查询执行(而不是每个查询编译或重新编译)返回的信息都会更新。 使用情况统计信息不会持久保存,并且仅在重启数据库引擎之前保留。 如果数据库管理员要在服务器回收后保留使用情况统计信息,则应该定期制作缺失索引信息的备份副本。 使用 sys.dm_os_sys_info 中的 sqlserver_start_time 列查找上次数据库引擎启动时间。

注意

此 DMV 的结果集限制为 600 行。 每行包含一个缺失的索引。 如果缺少的索引超过 600 个,则应解决现有的缺失索引,以便查看较新的索引。

一个缺少的索引组可能有多个查询需要同一索引。 有关此 DMV 中需要特定索引的各个查询的详细信息,请参阅 sys.dm_db_missing_index_group_stats_query

权限

若要查询此动态管理视图,必须授予用户 VIEW SERVER STATE 权限或隐含 VIEW SERVER STATE 权限的任何权限。

SQL Server 2022 及更高版本的权限

要求对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。

示例

以下示例演示如何使用 sys.dm_db_missing_index_group_stats 动态管理视图。 详细了解有关在优化非聚集索引时 使用缺失索引的指南,以及缺少索引建议

A. A. 查找十个具有最高用户查询预期提高的缺失索引

下面的查询确定了将生成最高预期累计提高的十个缺失索引,按降序排列。

SELECT TOP 10 *  
FROM sys.dm_db_missing_index_group_stats  
ORDER BY avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)DESC;  

B. 查找特定缺失索引组的单个缺失索引及其列详细信息

下面的查询确定哪些缺失索引构成特定缺失索引组,并显示其列详细信息。 为了此示例,缺少的索引 group_handle 为 24。

SELECT migs.group_handle, mid.*  
FROM sys.dm_db_missing_index_group_stats AS migs  
INNER JOIN sys.dm_db_missing_index_groups AS mig  
    ON (migs.group_handle = mig.index_group_handle)  
INNER JOIN sys.dm_db_missing_index_details AS mid  
    ON (mig.index_handle = mid.index_handle)  
WHERE migs.group_handle = 24;  

此查询提供缺失索引的数据库、架构和表的名称。 它还提供应该用于索引键的列的名称。 编写 CREATE INDEX DDL 语句以实现缺失索引时,请先列出相等列,然后在 CREATE INDEX 语句的 ON <table_name> 子句中列出相等列。 应该在 CREATE INDEX 语句的 INCLUDE 子句中列出包含列。 若要确定相等列的有效顺序,请基于其选择性排序,首先列出选择性最强的列(列列表中的最左侧)。 了解如何 应用缺少的索引建议

后续步骤

在以下文章中详细了解缺少的索引功能: