(4.6)sql server索引缺失提示
sql server索引缺失提示
当大家发现数据库查询性能很慢的时候,大家都会想到加索引来优化数据库查询性能,
但是面对一个复杂的SQL语句,找到一个优化的索引组合对人脑来讲,真的不是一件很简单的事。
好在SQLSERVER提供了两种“自动”功能,给你建议,该怎么调整索引
--缺失索引
SELECT
avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)
AS PossibleImprovement
,last_user_seek
,last_user_scan
,statement AS Object
,'CREATE INDEX [IDX_' + CONVERT(VARCHAR,GS.Group_Handle) + '_' +
CONVERT(VARCHAR,D.Index_Handle) + '_'
+ REPLACE(REPLACE(REPLACE([statement],']',''),'[',''),'.','') +
']'
+' ON '
+ [statement]
+ ' (' + ISNULL (equality_columns,'')
+ CASE WHEN equality_columns IS NOT NULL AND inequality_columns IS
NOT NULL THEN ',' ELSE '' END
+ ISNULL (inequality_columns, '')
+ ')'
+ ISNULL (' INCLUDE (' + included_columns + ')', '')
AS Create_Index_Syntax
FROM
sys.dm_db_missing_index_groups AS G
INNER JOIN
sys.dm_db_missing_index_group_stats AS GS
ON
GS.group_handle = G.index_group_handle
INNER JOIN
sys.dm_db_missing_index_details AS D
ON
G.index_handle = D.index_handle
Order By PossibleImprovement DESC --未使用索引
SELECT
ind.Index_id,
obj.Name as TableName,
ind.Name as IndexName,
ind.Type_Desc,
indUsage.user_seeks,
indUsage.user_scans,
indUsage.user_lookups,
indUsage.user_updates,
indUsage.last_user_seek,
indUsage.last_user_scan,
'drop index [' + ind.name + '] ON [' + obj.name + ']' as
DropIndexCommand
FROM
Sys.Indexes as ind
JOIN
Sys.Objects as obj
ON
ind.object_id=obj.Object_ID
LEFT JOIN
sys.dm_db_index_usage_stats indUsage
ON
ind.object_id = indUsage.object_id
AND
ind.Index_id=indUsage.Index_id
WHERE
ind.type_desc<>'HEAP' and obj.type<>'S'
AND
objectproperty(obj.object_id,'isusertable') = 1
AND
(isnull(indUsage.user_seeks,0) = 0
AND
isnull(indUsage.user_scans,0) = 0
AND
isnull(indUsage.user_lookups,0) = 0)
ORDER BY
obj.name,ind.Name
GO
第一种是使用DMV
第二种是使用DTA (database engine tuning advisor) 数据库引擎优化顾问
这篇文章主要讲第一种
从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记录了当前数据库下所有的missing index的信息,他针对的是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:索引缺失的表的名称
比如下面这个查询结果

那么应该创建这样的索引
1 CREATE INDEX idx_SalesOrderDetail_test_ProductID_IncludeIndex ON SalesOrderDetail_test(ProductID) INCLUDE(SalesOrderID)
在ProductID上创建索引,SalesOrderID作为包含性列的索引
注意事项:
由 sys.dm_db_missing_index_details 返回的信息会在查询优化器优化查询时更新,因而不是持久化的。
缺失索引信息只保留到重新启动SQL Server 前。如果数据库管理员要在服务器回收后保留缺失索引信息,
则应定期制作缺失索引信息的备份副本
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
下面是MSDN给出的示例,缺失索引组句柄为 2



1 --查询提供缺失索引的数据库、架构和表的名称。它还提供应该用于索引键的列的名称
2 USE [AdventureWorks]
3 GO
4 SELECT migs.group_handle, mid.*
5 FROM sys.dm_db_missing_index_group_stats AS migs
6 INNER JOIN sys.dm_db_missing_index_groups AS mig
7 ON (migs.group_handle = mig.index_group_handle)
8 INNER JOIN sys.dm_db_missing_index_details AS mid
9 ON (mig.index_handle = mid.index_handle)
10 WHERE migs.group_handle = 2




示例代码:



1 USE [AdventureWorks] --要查询索引缺失的数据库
2 GO
3 SELECT * FROM sys.[dm_db_missing_index_details]
4 SELECT * FROM sys.[dm_db_missing_index_groups]
5 SELECT * FROM sys.[dm_db_missing_index_group_stats]
6 SELECT * FROM sys.[dm_db_missing_index_columns](1) --1 :1是根据dm_db_missing_index_details查出来的




我估计XX大侠做的SQLSERVER索引优化器也使用了"sys.dm_db_missing_index_details" 这个DMV

刚才看了一下,好像有错别字:Total Cost不是Totol Cost
暂时不知道Total Cost跟Improvement Measure怎麽算出来的
上面几个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
注意:
最后大家还需要注意一下,虽然这些DMV给出的建议还是比较合理的。
但是,DBA还是需要去确认一下建议。因为这个建议完全是根据语句本身给出的,
没有考虑对其他语句的影响,也没有考虑维护索引的成本,所以是很片面的。
其准确性,也要再确认一下
(4.6)sql server索引缺失提示的更多相关文章
- SQL Server 索引维护(1)——系统常见的索引问题
		
前言: 在很多系统中,比如本人目前管理的数据库,索引经常被滥用,甚至使用DTA(数据库引擎优化顾问)来成批创建索引(DTA目前个人认为它的真正用处应该是在发现缺失的统计信息,在以前的项目中,用过一次D ...
 - SQL Server 索引维护:系统常见的索引问题
		
在很多系统中,比如本人目前管理的数据库,索引经常被滥用,甚至使用DTA(数据库引擎优化顾问)来成批创建索引(DTA目前个人认为它的真正用处应该是在发现缺失的统计信息,在以前的项目中,用过一次DTA,里 ...
 - 【译】SQL Server索引进阶第八篇:唯一索引
		
原文:[译]SQL Server索引进阶第八篇:唯一索引 索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就 ...
 - SQL Server索引进阶:第九级,读懂执行计划
		
原文地址: Stairway to SQL Server Indexes: Level 9,Reading Query Plans 本文是SQL Server索引进阶系列(Stairway to SQ ...
 - SQL Server索引进阶:第八级,唯一索引
		
原文地址: Stairway to SQL Server Indexes: Level 8,Unique Indexes 本文是SQL Server索引进阶系列(Stairway to SQL Ser ...
 - SQL Server索引进阶:第七级,过滤的索引
		
原文地址: Stairway to SQL Server Indexes: Level 7,Filtered Indexes 本文是SQL Server索引进阶系列(Stairway to SQL S ...
 - [转帖]SQL Server 索引中include的魅力(具有包含性列的索引)
		
SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 上个 ...
 - SQL Server 索引中include
		
SQL Server 索引中include的魅力(具有包含性列的索引) http://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html 开文 ...
 - sql server 索引总结三
		
一.非聚集索引维护 非聚集索引的行定位器值保持相同的聚集索引值,即使该聚集索引列物理上重新定位后,也是如此. 为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割之后指向 ...
 
随机推荐
- 转MQTT SERVER 性能测试报告
			
硬件环境: 内存4G CPU4核 SERVER及端口: apollo端口 61619 mosquitto:端口 1884 activeMQ端口:1883 emqtt 端口1885 测试方法 并发测试: ...
 - sql 转 markdown
			
https://github.com/2liang/AutoBuildDocFromDB SQL脚本生成数据字典 http://www.jianshu.com/p/f491d0d3c503 这两个脚本 ...
 - Atitit.一些公司的开源项目 重大知名开源项目attilax总结
			
Atitit.一些公司的开源项目 重大知名开源项目attilax总结 1. Twitter--Bootstrap:1 2. Google2 2.1. Gson2 2.2. Angular.Js2 2. ...
 - TCP四次挥手断开连接详解
			
TCP四次挥手. 数据传输结束后,通信的双方都可释放连接.现在A和B都处于ESTABLISHED状态.A的应用程序先向TCP发出连接释放报文段,主动关闭TCP连接.A把连接释放报文段的首部FIN置为1 ...
 - Linux学习之inode说明
			
硬盘是常见的存储设备,最小单位叫做扇区,大小512kb. 文件存储在硬盘中,文件存储最小单位叫做块,大小通常为4k. iNode用于存放文件的元信息,元信息如下: 所有者 所有组 权限 时间戳,cti ...
 - VM603:1 Uncaught SyntaxError: Unexpected token o in JSON at position 1
			
再用JQuery解析json的时候出现了这样一个问题 VM603: Uncaught SyntaxError: Unexpected token o 通过查阅资料发现,是由于解析json文件的时候解析 ...
 - 小米Note全网通支持7模19频:先发标准版
			
2015-06-26 16:42:53 17749 次阅读 9 次推荐 稿源:安卓中国 43 条评论 感谢安卓中国的投递 自古一入电信深似海,从此手机没法买.现在首台全网通小米手机即将诞生.6 月 2 ...
 - 依赖Spring的情况下,Java Web项目如何在启动时加载数据库中的数据?
			
原文:https://blog.csdn.net/u012345283/article/details/39558537 原文:https://blog.csdn.net/wandrong/artic ...
 - Hibernate生成器类
			
在Hibernate中,id元素的<generator>子元素用于生成持久化类的对象的唯一标识符. Hibernate框架中定义了许多生成器类. 所有的生成器类都实现了org.hibern ...
 - Redis特性和应用场景
			
Redis特性 速度快 Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快.官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到81000/s和11000 ...