天天看点

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失摘要问题引入场景分析解决方法总结

cpu高使用率往往会导致sql server服务响应缓慢,查询超时,甚至服务挂起僵死,可以说cpu高使用率是数据库这种后台进程服务的第一大杀手。本系列文章之一的“索引缺失”就是cpu高使用率的最常见的原因之一。

“鸟啊,我们平时在服务阿里云rds sql server客户的过程中,遇到最多的一个问题就是,客户反馈rds sql server数据库cpu使用率很高(有时超过90%,甚至到100%),导致查询缓慢甚至超时,这类问题要如何解决啊?”。老鸟已经被类似的问题烦透了。

“鸟哥,关于cpu高使用率高问题,原因各式各样,不是一两句话能够说得清楚的。”,菜鸟开始卖关子了:“那,要不这样吧,我写一个专题系列文章来分析各种场景,以解决rds sql server cpu高使用率的问题吧。”。

关系型数据库(rdbms)系统中,索引缺失最为常见会导致i/o读取很高,进而导致cpu使用率很高。这是因为当查询优化器在执行计划评估过程中,发现没有合适的索引可以使用时,不得不选择走全表扫描(table scan)或者近似于全表扫描的操作(clustered index scan)来获取所需要的数据。这种大面积的数据扫面会导致i/o子系统读取操作频繁,sql server需要读取大量的数据并加载到内存中,这些操作最后都会使得cpu使用率飙高。这种场景中,解决cpu高使用率的问题,其实就变成了解决索引缺失的问题。我们可以从下面的例子中来看看如何发现和解决索引缺失的问题。

在这里,我们将这个例子详细分解为五个小步骤:

 测试环境:搭建简单的测试环境。

 执行查询:创建缺失索引前后用于做性能对比的查询语句

 缺失索引:查找缺失索引的方法

 解决问题:创建缺失的索引

 效率对比:创建缺失索引前后的性能对比

创建测试环境包括:创建测试数据库、测试表对象和初始化200万条记录。

初始化了200万条数据,如下:

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失摘要问题引入场景分析解决方法总结

查询用户10057在近一个月内的商品购买情况(为了获取性能对比信息,我打开了time和i/o统计),建议在执行语句之前打开实际执行计划获取选项。打开实际执行计划,方法是点击ssms中的下图方框中图标,或者使用快捷键ctrl + m:

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失摘要问题引入场景分析解决方法总结

执行查询语句:

执行查询语句的i/o,cpu和时间消耗,其中,逻辑i/o读取消耗32295,cpu消耗451 ms,执行时间消耗648 ms,如下图展示:

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失摘要问题引入场景分析解决方法总结

执行计划走clustered index scan(性能消耗几乎于table scan相近),索引缺失警告信息,如下图绿色字体,右键点击,然后选择missing indexes details...可以打开缺失索引的详细信息:

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失摘要问题引入场景分析解决方法总结

除了上面事例讲解的执行计划查看缺失索引的方法以外,我们还可以使用三个重要的系统动态视图来查看缺失索引(每个视图具体含义,请自行查看帮助文档):

 sys.dm_db_missing_index_group_stats

 sys.dm_db_missing_index_groups

 sys.dm_db_missing_index_details

利用三个系统动态视图来查找缺失的索引,方法如下:

执行后的查询结果如下图所示:

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失摘要问题引入场景分析解决方法总结

无论是通过执行计划查看索引缺失,还是通过三个动态视图获取缺失索引,最终的目的就是解决问题,让我们创建这个缺失的索引:

创建了这个缺失索引以后,再次上面执行上面“执行查询”中的查询语句,执行计划和性能消耗对比。

执行计划,已经走到了更加高效的index seek上来了,如下图所示:

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失摘要问题引入场景分析解决方法总结

i/o读逻辑取消耗为126、cpu消耗为16 ms和执行时间消耗为198 ms,截图如下:

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失摘要问题引入场景分析解决方法总结

创建索引后,执行时间消耗,cpu消耗,i/o读取消耗,分别提高了3.27倍,28.19倍和256.3倍,平均性能提高了95.92倍。对比情况做图如下:

RDS SQL Server - 最佳实践 - 高CPU使用率系列之索引缺失摘要问题引入场景分析解决方法总结

这篇文章从理论结合实际,介绍了cpu高使用率的解决方法系列文章之一,缺失索引。从最终的测试结果来看,创建索引后,对于特定查询性能在cpu使用率、时间消耗和i/o读取三个方面都有很大提升,尤其是i/o读取操作提高了256.3倍,平均的性能提升达到了95.92倍,效果十分明显。