性能优化:核心库CPU使用率100%,SQL优化后执行效率提升10000多倍

墨墨导读:某客户一系统早上业务高峰时段RAC数据库两节点CPU使用率接近100%,导致业务响应缓慢,通过分析原因定位SQL完成优化改写后降低CPU的使用率,业务恢复正常。

问题现象

客户一系统在2020年12月15日早上业务高峰时段zCloud监控系统告警数据库RAC两个节点CPU100%,数据库大量会话堆积,致业务系统响应缓慢。

cpu过高原因分析

1. 定位导致cpu使用过高的用户

通过操作系统命令top可以看到cpu使用过高均为user占用而非sys,通过查看进程可以看到排在前面的均为oracle用户的进程,且进程号不断变化,由此可以确定是Oracle前台用户导致CPU使用率过高,接下来我们需要查看数据库会话以确定具体原因。

2. 检查数据库会话定位消耗CPU资源较高的会话及SQL

通过zCloud的活动会话TOP 5 Wait Event可以看到大部分会话的等待集中在ON CPU及latch:cache buffers chains,通过TOP等待事件不难看出CPU过高的原因主要为过多的cbc latch等待造成,进一步通过等待事件旁边的过滤器筛选出对应的活动会话可以发现latch:cache buffers chains等待对应的会话的SQL ID均为cuk5cguanbaqt,即为同一个SQL。由于在没有保存问题时刻的截图,这里我们通过对历史性能的下钻分析截图如下:

可以看到该SQL单次平均执行时间为2分钟多,1小时内执行611次,SQL执行效率较差且SQL执行较频繁导致在同一时间出现大量会话等待cbc latch,且cbc latch的等待进一步导致超高的CPU使用率。

分析SQL的性能瓶颈

我们通过zCloud把SQL中绑定变量替换后在sqlplus中执行SQL,然后查看SQL monitor可以看到该SQL的性能瓶颈主要在于merge join中两部分执行次数均为900万次,也就是说其中相关索引和表被多次访问。

SQL性能优化方法

原始SQL文本如下:

由于应用开发人员SQL写的比较复杂,在公司专家怀晓明老师的协助和支持下对SQL进行了下面的改写优化。

1. 减少相关索引和表的访问次数

通过使用with as将MERGE JOIN中的二部分SQL单独拿出进行了改写,一方面让这二部分SQL对应的相关索引和表只访问一次,另一方面也让SQL的逻辑结构更加明朗。

2. 去除不必要的join

由于order_id是2个left join关联表的主键

此时left join是完全没必要的,所以将left join及对应的表从SQL文本中去除减少1次表关联。

3. 进一步减少c表通过索引扫描的结果集

在with as的第二部分是c表和orf表的关联,在这2个表join中,c表没有过滤条件返回了表中大部分数据,且c表的数据量是百万级的,这部分开销还是有一些大。通过查看统计信息,可以看出with as第一部分中o表通过条件过滤后结果集很小,原始的sql结构为select xxx from o where o.order_id in (xxxx),这里的o.order_id正是来源于子查询最内层的c表。由于c表与orf表关联时返回较多的记录,o表通过条件过滤返回较少的记录,我们通过增加exists条件将o表与c表进行一次关联,通过这样等价改写在c表和orf表关联前就过滤掉大部分数据,减少关联时的结果集。

c表通过索引返回了840多万的数据量接近表的数据量900多万:

o表通过条件过滤返回不到2000条数据:

等价改写如下:

最终改写完成的SQL如下:

SQL文本改写后的效果

可以看出优化前SQL单次执行时间为154s,这和zCloud的平均执行时间2分钟一致,改写优化后执行时间为12ms。优化前单次逻辑读为11000多万,改写优化后单次逻辑读为1万多。SQL执行效率提升了10000多倍。

优化前:

优化后:

墨天轮原文链接:https://www.modb.pro/db/43085(复制到浏览器中打开或者点击“阅读原文”立即查看)

(0)

相关推荐

  • SQL效率

    雀儿山(海拔6168米) 不良的SQL往往来自于不恰当的索引设计.不充份的连接条件和不可优化的where子句. 一.索引的建立和使用 1.定义主键的数据列一定要建立索引 2.定义有外键的数据列一定要建 ...

  • SQL查询优化实践

    为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上,即随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢,且数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库时 ...

  • oracle数据库应用开发经验

    l  日志表应该以时间做分区,方便清理 一般应用都会有一些表用来记录用户操作日志,数据变更记录,交易流水等日志型的库表.这些表最好按时间字段做分区,这样在迁移或者清理历史记录时会比较方便,借助orac ...

  • SQL执行效率优化:效率提升几万倍的操作详解

                              本文介绍的是SQL执行效率优化的详细操作,相关内容请点击:SQL执行效率的优化.我用的数据库是MySQL5.6,下面简单的介绍下场景场景本文介绍的是 ...

  • SqlServer性能优化,查看CPU、内存占用大的会话及SQL语句

    SqlServer性能优化,查看CPU、内存占用大的会话及SQL语句

  • 重庆大学6种期刊入选CSCD来源期刊,核心库入选量占重庆高校一半

    重庆讯    近日,中国科学引文数据库(Chinese Science Citation Data,CSCD)公布了2021-2022年来源期刊,重庆大学主办的<重庆大学学报><土木 ...

  • 如何在Windows中解决磁盘使用率100%

    Hello大家好,本期视频中,小编为大家介绍了如何将你的磁盘使用率降低到正常值,一起往下看看吧. 02:00 02:00 03:30 / 03:30  1. 使用戴尔内置的Support Assist ...

  • CPU占用100%,电脑卡顿原来可以这样解决!多任务操作也运行如飞

    相信不少朋友都遇到过笔记本卡顿的情况,有时竟连打开文档都很费劲!可查看一番,自己也就打开了几个网页,在解压文件夹的时候打开文档就卡住了,在任务管理器中,嚯!一看吓一跳,CPU占用率高达100%!此时难 ...

  • 聊聊SQL优化的基础思路

    SQL优化是Oracle数据库中比较难的部分,需要对Oracle数据库具备非常扎实的理论基础.但是在刚开始接触时,往往不能很好地将理论知识应用到实践,或者有了一定的思路,又不自信或不敢确定是不是正确的 ...

  • 内链的SEO优化核心策略是什么呢?

    内链,顾名思义就是在同一网站域名下的内容页面之间的互相链接(自己网站的内容链接到自己网站的内部页面,也称之为站内链接).合理的网站内链接构造,能提高搜索引擎的收录与网站权重.相对外部链接,内部链接也很 ...

  • 聊聊 top 命令中的 CPU 使用率

    之前写过cpu占用率的文章 CPU占用率是什么? ==== 平常我们使用 top 命令来查看系统的性能情况,在 top 命令中可以看到很多不同类型的 CPU 使用率,如下图红框中标出部分: 下面,我们 ...

  • 教你如何快速定位当前数据库消耗 CPU 最高的 sql 语句

    原文链接:https://reurl.cc/7rj8jd 这篇文章主要介绍怎么快速定位当前数据库消耗CPU最高的sql语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 如何快 ...