一个表缺失索引引发的CPU资源瓶颈案例

2020年1月22日13:54:22
评论

背景

近几日,公司的应用团队反应业务系统突然变慢了,之前是一直比较正常。后与业务部门沟通了解详情,得知最近生意比较好,同时也在做大的促销活动,使得业务数据处理的量出现较大的增长,最终系统在处理时出现瓶颈。

分析和追踪问题的根源

首先:通过工具追踪服务器的性能,主要定位什么资源、在什么时候出现瓶颈。

这样的工具很多,可以网上搜搜工具和使用方法如PerMon和PAL等,最终得到结果是在业务高峰期(中午12点到23点前)如下图,CPU资源使用率一直很高,初步可以判断是CPU资源紧张。那真的“资源”不够吗?!不一定,进一步分析。

一个表缺失索引引发的CPU资源瓶颈案例

 

下一步,要更进一步实时监测到底什么东西在消耗CPU资源。

可以实时监控SQL Server资源的工具也很多,我这里使用的SQL Server Profiler,通过过滤和筛选相关Event后抓取想要的列,最主要是CPU这一列的值,如下:

一个表缺失索引引发的CPU资源瓶颈案例

 

上图,查看每一列CPU资源使用情况,看起来是不是很累,还好有另外一个国外很好的工具ClearTrace,它可以很轻松地分析出trc文件中最占资源的如CPU/Reads/Writes等,这里重点分析CPU,如下图标出,第一二行就是导致CPU资源瓶颈的SQL语句

一个表缺失索引引发的CPU资源瓶颈案例

 

 

下一步,重点单独调试、分析上面列出的有问题语句。

我采用做法是将上面拷贝出来并填写对应条件参数的值,将整个语句拿到SSMS中单独调试,开启Actual Execution Plan和IO、Time统计,如下图显示单次执行logical read接近8.5w次,执行计划显示查找是通过索引扫描,这个表比较大,所以查询效率很低。而恰恰在这个案例中该语句执行频率极高,最终给资源特别是CPU造成很大损耗。

这里推荐大家另外一个不错的执行计划分析工具sqlsentry plan Explorer。

一个表缺失索引引发的CPU资源瓶颈案例 

接下来,试着在QA环境中,根据语句条件加上合适的非聚集索引。

看一下效果如下图,logical reads降到个位数,加上非聚集索引后,执行计划走的Index Seek,查询效率极大提升。

一个表缺失索引引发的CPU资源瓶颈案例

 

最后,实施到生产环境后,查看优化效果。

一个表缺失索引引发的CPU资源瓶颈案例

 

总结

企鹅博客
  • 本文由 发表于 2020年1月22日13:54:22
  • 转载请务必保留本文链接:https://www.qieseo.com/193399.html

发表评论