sqlserver关于缺少索引的建议是怎么来的?

142 篇文章 26 订阅
6 篇文章 0 订阅

看sqlserver执行计划的时候有时会看到这样一行小绿字:

它会告诉你当前sql应该在哪些列上建索引(还有include列),建完之后能提升多少性能。对于特别复杂的sql,这个建议有时还是很方便的。那么这些数据是从哪查出来的?

sqlserver有四个索引缺失相关的视图:

  • sys.dm_db_missing_index_details
  • sys.dm_db_missing_index_columns(index_handle)
  • sys.dm_db_missing_index_groups
  • sys.dm_db_missing_index_group_stats

以上视图返回的信息会在查询优化器优化查询时更新,因而不是持久化的,缺失的索引信息只保留到重新启动SQL Server前。如果要在服务器回收后保留缺失索引信息,则应定期进行备份。

 

1. sys.dm_db_missing_index_details

返回有关缺失索引的详细信息,不包括空间索引。针对的是SQLSERVER从启动以来所有运行的语句,而不是某一个查询。

列名数据类型描述
index_handleint标识特定的缺失索引,该标识符在服务器中是唯一的
database_idsmallint标识带有缺失索引的表所在的数据库
object_idint标识索引缺失的表
equality_columnsnvarchar(4000)构成相等谓词的列的逗号分隔列表,谓词的形式如下:
where table.column =constant_value
inequality_columnsnvarchar(4000)构成不等谓词的列的逗号分隔列表,谓词的形式如下:
where table.column > constant_value
“=”之外的任何比较运算符都表示不相等。
included_columnsnvarchar(4000)应该加在索引include部分的列。对于内存优化的索引 (包括哈希和内存优化非聚集),忽略included_columns。 每个内存优化索引中均包含表的所有列。
statementnvarchar(4000)索引缺失的表的名称。

 

2. sys.dm_db_missing_index_columns(index_handle)

这是个动态管理函数,返回与缺少索引(不包括空间索引)的数据库表列有关的信息。

列名数据类型描述
column_idint列的 ID。
column_namesysname表列的名称。
column_usagevarchar(20)查询使用列的方式。 可能的值及其说明是:
equality:table.column = constant_value
inequality:table.column > constant_value。 “=”之外的任何比较运算符都表示不相等。
include:用于索引的include列
select * from sys.dm_db_missing_index_columns(54);

返回的内容含义跟第一个视图类似,但是可读性稍微没那么好。比如根据上图,sqlserver的建议是:在ProductID上创建索引,SalesOrderID作为包含性列的索引。

CREATE INDEX idx_SalesOrderDetail_test_ProductID_IncludeIndex ON SalesOrderDetail_test(ProductID) INCLUDE(SalesOrderID);

 

3. sys.dm_db_missing_index_groups

返回有关特定缺失索引组中包含的缺失索引的信息,不包括空间索引(感觉没太大用处)

列名数据类型描述
index_group_handleint标识缺失索引组。
index_handleint标识缺失索引所属由指定的组index_group_handle

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

 

4. sys.dm_db_missing_index_group_stats

返回缺失索引组的摘要信息,不包括空间索引。最主要是avg_user_impact这个字段,告诉你增加了这个缺失索引,性能可以提高的百分比。

列名数据类型描述
group_handleint标识缺失索引组。 此标识符在服务器中是唯一的。
其他列提供有关组中的索引被视为缺失的所有查询的信息。
一个索引组仅包含一个索引。
unique_compilesbigint将从该缺失索引组受益的编译和重新编译数。 许多不同查询的编译和重新编译可影响该列值。
user_seeksbigint由可能使用了组中建议索引的用户查询所导致的查找次数。
user_scansbigint由可能使用了组中建议索引的用户查询所导致的扫描次数。
last_user_seekdatetime由可能使用了组中建议索引的用户查询所导致的上次查找日期和时间。
last_user_scandatetime由可能使用了组中建议索引的用户查询所导致的上次扫描日期和时间。
avg_total_user_costfloat可通过组中的索引减少的用户查询的平均成本。
avg_user_impactfloat实现此缺失索引组后,用户查询可能获得的平均百分比收益。 该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。
system_seeksbigint由可能使用了组中建议索引的系统查询(如自动统计信息查询)所导致的查找次数。 有关详细信息,请参阅Auto Stats 事件类
system_scansbigint由可能使用了组中建议索引的系统查询所导致的扫描次数。
last_system_seekdatetime由可能使用了组中建议索引的系统查询所导致的上次系统查找日期和时间。
last_system_scandatetime由可能使用了组中建议索引的系统查询所导致的上次系统扫描日期和时间。
avg_total_system_costfloat可通过组中的索引减少的系统查询的平均成本。
avg_system_impactfloat实现此缺失索引组后,系统查询可能获得的平均百分比收益。 该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。

 

参考

https://docs.microsoft.com/zh-cn/sql/relational-databases/system-dynamic-management-views/sys-dm-db-missing-index-group-stats-transact-sql?view=sql-server-ver15

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值