sys.dm_db_missing_index_group_stats_query (Transact-SQL)

适用于:SQL Server 2019 (15.x) Azure SQL DatabaseAzure SQL 托管实例

返回有关需要缺失索引组(不包括空间索引)中缺失索引的查询的信息。 每个缺失的索引组可能会返回多个查询。 一个缺失的索引组可能有多个需要相同索引的查询。

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

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

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

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

可以在 sys.dm_db_missing_index_groups 中加入index_group_handle
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 以字节为单位,从 0 开始指示查询的起始位置,该查询在其 SQL 批处理中需要此索引的最后一个编译语句的批处理或持久化对象的文本中。
last_statement_end_offset int 以字节为单位,从 0 开始,指示查询的结束位置,该查询在其 SQL 批处理中需要此索引的最后一个编译语句的批处理或持久化对象的文本中。
last_statement_sql_handle varbinary(64) 唯一标识需要此索引的最后一个编译语句的批处理或存储过程的标记。 由查询存储使用。 与 不同last_sql_handlesys.query_store_query_text引用statement_sql_handle查询存储目录视图sys.query_store_query_text使用的 。

如果在编译查询时未启用查询存储,则 返回 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 由可能使用了组中建议索引的系统查询(如自动统计信息查询)所导致的查找次数。 有关详细信息,请参阅 Auto Stats 事件类
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; 

后续步骤

在以下文章中详细了解缺少的索引功能和相关概念: