SQLSERVER如何查看索引缺失及DMV使用介绍
当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能,但是面对一个复杂的SQL语句,找到一个优化的索引组合对人脑来讲,真的不是一件很简单的事。
好在SQLSERVER提供了两种“自动”功能,给你建议,该怎么调整索引
第一种是使用DMV
第二种是使用DTA(databaseenginetuningadvisor)数据库引擎优化顾问
这篇文章主要讲第一种
从SQL2005以后,在SQLSERVER对任何一句语句做编译的时候,都会去评估一下,
这句话是不是缺少什么索引的支持,如果他认为是,他还会预估,如果有这麽一个索引
他的性能能提高多少
SQLSERVER有几个动态管理视图
sys.dm_db_missing_index_details
sys.dm_db_missing_index_groups
sys.dm_db_missing_index_group_stats
sys.dm_db_missing_index_columns(index_handle)
sys.dm_db_missing_index_details
这个DMV记录了当前数据库下所有的missingindex的信息,他针对的是SQLSERVER从启动以来所有运行的语句,
而不是针对某一个查询。DBA可以看看,哪些表格SQLSERVER对他是最有“意见”的
以下是这个DMV的各个字段的解释:
1、index_handle:标识特定的缺失索引。该标识符在服务器中是唯一的。index_handle是此表的密钥
2、database_id:标识带有缺失索引的表所驻留的数据库
3、object_id:标识索引缺失的表
4、equality_columns:构成相等谓词的列的逗号分隔列表即哪个字段缺失了索引会在这里列出来(简单来讲就是where后面的筛选字段),
谓词的形式如下:table.column=constant_value
5、inequality_columns:构成不等谓词的列的逗号分隔列表,例如以下形式的谓词:table.column>constant_value“=”之外的任何比较运算符都表示不相等。
6、included_columns:用于查询的涵盖列的逗号分隔列表(简单来讲就是select后面的字段)。
7、statement:索引缺失的表的名称
比如下面这个查询结果
那么应该创建这样的索引
CREATEINDEXidx_SalesOrderDetail_test_ProductID_IncludeIndexONSalesOrderDetail_test(ProductID)INCLUDE(SalesOrderID)
在ProductID上创建索引,SalesOrderID作为包含性列的索引
注意事项:
由sys.dm_db_missing_index_details返回的信息会在查询优化器优化查询时更新,因而不是持久化的。
缺失索引信息只保留到重新启动SQLServer前。如果数据库管理员要在服务器回收后保留缺失索引信息,
则应定期制作缺失索引信息的备份副本
sys.dm_db_missing_index_columns(index_handle)
返回与缺少索引(不包括空间索引)的数据库表列有关的信息,sys.dm_db_missing_index_columns是一个动态管理函数
字段解释
index_handle:唯一地标识缺失索引的整数。
sys.dm_db_missing_index_groups
返回有关特定缺失索引组中包含的缺失索引(不包括空间索引)的信息
sys.dm_db_missing_index_group_stats
返回缺失索引组的摘要信息,不包括空间索引
这个视图说白了就是预估有这麽一个索引,他的性能能提高多少
有一个字段比较重要:
avg_user_impact:实现此缺失索引组后,用户查询可能获得的平均百分比收益。该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。
就是说,增加了这个缺失索引,性能可以提高的百分比
下面是MSDN给出的示例,缺失索引组句柄为2
--查询提供缺失索引的数据库、架构和表的名称。它还提供应该用于索引键的列的名称
USE[AdventureWorks]
GO
SELECTmigs.group_handle,mid.*
FROMsys.dm_db_missing_index_group_statsASmigs
INNERJOINsys.dm_db_missing_index_groupsASmig
ON(migs.group_handle=mig.index_group_handle)
INNERJOINsys.dm_db_missing_index_detailsASmid
ON(mig.index_handle=mid.index_handle)
WHEREmigs.group_handle=2
示例代码:
USE[AdventureWorks]--要查询索引缺失的数据库
GO
SELECT*FROMsys.[dm_db_missing_index_details]
SELECT*FROMsys.[dm_db_missing_index_groups]
SELECT*FROMsys.[dm_db_missing_index_group_stats]
SELECT*FROMsys.[dm_db_missing_index_columns](1)--1:1是根据dm_db_missing_index_details查出来的
我估计XX大侠做的SQLSERVER索引优化器也使用了"sys.dm_db_missing_index_details"这个DMV
刚才看了一下,好像有错别字:TotalCost不是TotolCost
暂时不知道TotalCost跟ImprovementMeasure怎麽算出来的
注意:
最后大家还需要注意一下,虽然这些DMV给出的建议还是比较合理的。
但是,DBA还是需要去确认一下建议。因为这个建议完全是根据语句本身给出的,
没有考虑对其他语句的影响,也没有考虑维护索引的成本,所以是很片面的。
其准确性,也要再确认一下
上面几个DMV的字段解释,大家可以看一下MSDN,非常详细
sys.dm_db_missing_index_group_stats
msdn:http://msdn.microsoft.com/zh-cn/library/ms345421.aspx
sys.dm_db_missing_index_groups
msdn:http://msdn.microsoft.com/zh-cn/library/ms345407.aspx
sys.dm_db_missing_index_columns([sql_handle])
msdn:http://msdn.microsoft.com/zh-cn/library/ms345364.aspx
sys.dm_db_missing_index_details
msdn:http://msdn.microsoft.com/zh-cn/library/ms345434.aspx
相关文章
- 使用SQLServer客户端工具轻松实现数据库管理(sqlserver客户端工具)
- 知晓SQLServer在哪里:带你发掘计算机宝藏(sqlserver在哪里)
- SQLServer如何添加列?25字实用教程来袭!(sqlserver添加列)
- 数据如何优雅的清除SQLServer数据(清除 sqlserver)
- 架构未来:实现云端SQLServer智能运维(云端sqlserver)
- 像一道光,SQLServer照亮了前路(一 sqlserver)
- 权衡利弊:什么时候使用SQLServer,什么时候使用C?(sqlserver还是c)
- 优化使用最佳实践优化SQLserver表容量(sqlserver表容量)
- 使用SQLServer实现在线教学:网上学习变得更加便捷(sqlserver网课)
- 使用SQLServer实现短信发送功能(sqlserver短信)
- 码使用SQLServer挖掘手机号码的技巧(sqlserver手机号)
- 尝试使用SQLServer建立开创性的表格(sqlserver建立表)
- 使用SqlServer数据库管理数据表(sqlserver库表)
- 使用C操作SQLServer数据备份(sqlserver备份c)
- 恢复数据:使用SQLServer回滚点(sqlserver回滚点)
- 版使用SQLServer单机版的技术优势(sqlserver单机)
- SQLServer利用图表更便捷地显示数据(sqlserver做图表)
- 标题:利用SQLServer挖掘数据智慧(sqlserver 中文)
- 的使用掌握SQLServer函数,助力数据处理实力(sqlserver中函数)
- y r使用 SQLServer 全面支持 Python、R,实现数据分析的极致体验(sqlserver p)
- 使用SQLserver NT 提升企业的管理效能(sqlserver nt)
- 增强数据安全性借助SqlServer提升数据安全性(通过sqlserver)
- 连接SQLServer怎么解决慢问题?(连接sqlserver慢)
- 时间序列:使用SQLServer解锁更大潜能(sqlserver时序)