sys.dm_db_missing_index_group_stats_query (Transact-SQL)

适用于: Microsoft Fabric 中的 SQL Server 2019 (15.x) 及更高版本 Azure SQL 数据库Azure SQL 托管实例SQL 数据库

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

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

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

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

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

可以加入 index_group_handlesys.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 以字节为单位,以 为首 0,表示该行在其批处理或持久对象文本中描述的查询的结束位置,适用于最后一个编译后需要该索引的语句。
last_statement_sql_handle varbinary(64) 一个唯一标识最后一个编译语句的批处理或存储过程的令牌,需要该索引。 由查询存储使用。 last_sql_handle与查询存储目录视图sys.query_store_query_text使用的引用statement_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 查询执行(而不是每个查询编译或重新编译)返回的信息都会更新。 使用统计数据不会被持久化,只会保留到数据库引擎重启为止。

如果数据库管理员要在服务器回收后保留使用情况统计信息,则应该定期制作缺失索引信息的备份副本。 使用 sqlserver_start_time 中的 列查找上次数据库引擎启动时间。 还可以使用查询存储保留缺失的索引。

权限

要查询此动态管理视图,用户必须获得 VIEW SERVER STATE 权限或任何暗示该 VIEW SERVER STATE 权限的权限,适用于SQL Server 2019(15.x)及更早版本。

需要服务器上的 VIEW SERVER PERFORMANCE STATE 权限,适用于 SQL Server 2022(16.x)及更高版本。

示例

以下示例演示如何使用 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;