insert导致的性能问题大排查(r11笔记第26天)

今天开发的同学小窗口消息给我,向我咨询一个ORA错误的问题。

错误代码是ORA-30036,使用oerr ora 30036查看,由于是undo空间无法扩展导致。

这是一个统计业务的数据库,而且平时的负载其实并不高,确实有一些奇怪。首先排除了大事务导致的原因,查看数据库日志,和开发同学沟通,没有发现相关的错误信息。

所以第一感觉这是一个偶然发生的情况,不过开发的这位同学貌似碰到了问题,他说从应用端抛出了ORA-30036的错误。

java.sql.BatchUpdateException:ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS1'?
问题刚刚发生,问题确凿,说明插入数据出了问题。但是比较奇怪的是,我在环境中简单模拟了一下,却没有碰到这类问题。把数据量提升到百万还是可以成功。

和开发的同学做了确认,他发过来了执行失败的语句,这是一个看起来很简单的语句,当然我做了简单的脱敏。

insert into user_hh_max(id, stat_time, appkey) select seq_user_hh.nextval id, :1 stat_time, :2 appkey from dual;

 这样一个看似非常简答的INSERT看起来无论如何也不会导致很严重的性能问题,这一点我是深信不疑。除了序列的自增外,其它的地方我是真没看出来有什么性能隐患。

带着疑问,我看了下最近的数据库负载,都在正常的范围之内。查看归档的切换频率,发现问题看起来不是那么简单。

下面的图示,横轴是小时,纵轴是日期,这样就能够看到每个小时的归档切换情况,发现近些天来归档的切换频率比以前有了极大的提高。简单来说,以前基本上是一个小时2~3G的归档量,现在一下子变成了20~30G,而且还有增加的趋势。


得到了这样一个报告,让我对原本看起来不痛不痒的问题变得严峻起来,而且应用端确实有些统计出现了问题,希望我帮忙能先修复一下,这种情况下,我先扩容了Undo空间,然后静下心来分析这个奇怪的问题。

带着疑问我得到了一个AWR报告。

查看profile的部分,信息如下:

每秒 每个事务 每次调用
DB Time(s): 1.3 0.1 0.00
DB CPU(s): 1.1 0.1 0.00
Redo size: 8,826,942.0 730,730.2
Logical reads: 77,599.7 6,424.0
Block changes: 56,339.2 4,664.0
Physical reads: 33.6 2.8
Physical writes: 564.9 46.8
User calls: 1,686.8 139.6
Parses: 1.5 0.1
Hard parses: 0.4 0.0
W/A MB processed: 0.7 0.1
Logons: 0.0 0.0
Executes: 1,891.1
Rollbacks: 0.0 0.0
Transactions: 12.1

通过这部分内容,可以很明确看到每秒钟产生了8M左右的redo,在我的经历中,这是一个很频繁的数据变化,但是查看TPS不高,逻辑读很高。所以我的精力就马上集中在了SQL部分,看看有哪些DML的操作会导致如此高的消耗。

查看SQL部分的报告,得到了下面的一个表格。


这里的insert执行了500多万次,听起来其实也不高。我就在想单单是500万的insert肯定不会造成每小时20~30G的日志量。那么还有什么地方会导致问题呢。看着下面的语句,有一些update还有一连串的merge语句,自己还一度怀疑是否又是merge导致的性能问题,但是根据数据来分析,影响实在是太小了。

所以面对这样一种情况就很纠结,问题发生但是又很难定位出问题来。

我耐着性子又看了看报告。发现了这样一小段内容。

这部分内容就很奇怪了,完全不大符合逻辑,insert执行了500多万次,但是影响的行数是4000多万行。


查看其它的指标也没有找到明显性能问题。

这个问题该怎么继续往下查呢。

我想到了一种方法,既然产生了如此多的归档,那就看看到底redo里面是些什么内容不就一目了然了。使用了多少commit都能看得清清楚楚。

关于Logminer提取redo日志的信息,可以参考

Oracle闪回原理-Logminer解读redo(r11笔记第17天)

使用里面提供的两个脚本,很快就读出了redo的内容,正是insert语句。

我看到了大量的insert,但简单统计insert的数目,看起来这个量级和AWR报告中严重不符。

我查看了这个表的数据量,不到100万,而且对应的数据块也没有爆发式增长,这个现象真是奇怪。

此时我陷入了深思,这个问题该怎么解释,是AWR报告的bug吗?

因为这个表的数据量不大,我做了如下的测试,写了一个脚本,每隔2秒钟统计一下这个表的数据量,然后几分钟后,拿着得到的数据,得到了下面的一张图。

如下是这张表的数据量变化图,可以看到基本上是在1分钟内,会插入100万数据,然后马上清理掉,继续插入,如此反反复复。

毫无疑问,这个逻辑如此看来是有明显的问题的,经过反复确认,让开发的同学去看看这个逻辑的实现,是否哪里出了问题,很快就得到了反馈,他们发现了问题根源,及时从逻辑上做了调整。

从下面归档的切换情况可以看出问题有了立竿见影的效果。


所以由此一来,AWR的显示的数据有些地方就能够理解了。当然你也可以认为是报告的数据误导在先。

时间: 2024-10-26 10:14:42

insert导致的性能问题大排查(r11笔记第26天)的相关文章

MySQL中insert语句没有响应的问题分析(r11笔记第21天)

 今天开发的一个同学问我一个MySQL的问题,说在测试数据库中执行一条Insert语句之后很久没有响应.我一看语句是一个很常规的insert into xxx values形式的语句.看起来有些不太合乎常理啊,我对这类问题立马来了兴趣,准备好好看看到底是什么原因.  向开发同学了解了环境之后,我登录到服务端,首先查看是否可能是磁盘空间不足导致的问题.结果df -h的结果显示,空间还绰绰有余. 使用show proceslist查看线程情况. 可以看到大量的线程是Waiting for table

使用shell自动化诊断性能问题(一)(r11笔记第41天)

一直以来要做性能分析的自动化工作,但是久久没有动笔,今天索性来更新一版. 首先我希望得到的一个基本效果就是后台去扫描数据库的DB time,如果超出了阈值,比如这里我设置的为400(即DB time为400%),则会开启自动诊断的任务.时间范围是提前一个小时和当前时间.我对已有的脚本做了一些改动,加了一些逻辑,后续还会不断完善. DBTIME_THRESHOLD=400 DATE=`date '+%Y%m%d'` BEGIN_HOUR=`date -d"1 hour ago" +&qu

一条insert语句导致的性能问题分析(二)

今天对之前描述的问题一条insert语句导致的性能问题分析(一) 进行了进一步的补充. 有一条insert语句的主要性能瓶颈在于insert子句中的查询语句,查询中的主要资源消耗在于对两个表进行了多次关联 语句主要的结构如下: insert into xxxxx   (select * from TEST_vip_new minus select * from TEST_vip_new_bak         ) a left join TEST_vip_new_bak b         on

百倍性能的PL/SQL优化案例(r11笔记第13天)

我相信你是被百倍性能的字样吸引了,不过我所想侧重的是优化的思路,这个比优化技巧更重要,而结果嘛,其实我不希望说成是百倍提升,""自黑""一下.     有一个真实想法和大家讨论一下,就是一个SQL语句如果原本运行20秒,优化到了1秒,性能提升该说是20倍还是提高了95%.当然还见过一种说法,一条SQL语句每次运行20秒,每天运行100次,优化后每次运行1秒,运行还是100次,那么性能提升是说成优化累计时间为100*20-100=1990秒? 好了,我们来看看PL/S

一个SQL性能问题的优化探索(二)(r11笔记第38天)

继续前几天的一个案例一个SQL性能问题的优化探索(一)(r11笔记第33天) 如下的SQL语句存在索引字段CARD_NO,但是执行的时候却走了全表扫描,因为这是一个核心表,数据量很大,导致数据库负载很高. SQL_FULLTEXT ---------------------------------------------------------------------------------------------------- SELECT ID,CN,CARD_NO,TO_CHAR(CHAR

【中亦安图】导致Oracle性能抖动的参数提醒(4)

第一章 技术人生系列 · 我和数据中心的故事(第四期)-导致Oracle性能抖动的参数提醒 中亦安图 | 2016-01-25 21:39 前言 不知不觉,技术人生系列·我和数据中心的故事来到了第四期.小y又和大家见面了! 当您看到业务系统压测呈现以下波浪形的tps曲线时,你会怎么下手? 小y(中亦科技)今天要和大家分享的就是这样一个业务系统压测性能问题的分析和解决过程.这个问题困扰了客户相当长一段时间,幸运的是,小y通过远程在10分钟定位到了问题的原因并帮助客户最终解决了问题.需要说明的是,在

复杂SQL性能优化的剖析(二)(r11笔记第37天)

    昨天的一篇文章复杂SQL性能优化的剖析(一)(r11笔记第36天) 分析了一个SQL语句导致的性能问题,问题也算暂时告一段落,因为这个语句的执行频率是10分钟左右,所以优化后(大概是2秒左右,需要下周再次确认)的提升很大.    对于优化是一个持续的改进,我们碰到的问题,最终的原因可能五花八门,但是正如柯南所说,真相只有一个.我把这个问题和前几天处理的一个问题结合起来,前几天处理了一个紧急问题,也是有一个SQL语句的执行计划发生改变,这个语句的业务比较关键,触发频率是每分钟一次,如果一旦

优化-使用wm_concat导致的性能问题

问题描述 使用wm_concat导致的性能问题 sql类似如下select a.namewm_concat(a.c1)wm_concat(a.c2)wm_concat(a.c3)from table a group by a.name 这里要按名称分组将其他三个值都拼接起来,返回的都是clob类型,导致查询非常慢而且占用相当大的表空间...请教大神,这要如何优化?a.c1等拼接的值很容易超过4000... 解决方案 wm_concat的使用 解决方案二: 你的表结构不合理,你应该避免在查询的时候

2012 云计算导致行业并购事件大预测

本文讲的是2012 云计算导致行业并购事件大预测,回顾2011 IT市场年,可以说是一个并购的大年,谷歌125亿美元"迎娶"移动终端摩托罗拉,甲骨文15亿美元收购云计算服务商RightNow,VMware收购云计算PPT服务商SlideRocket,IBM宣布4.4亿美元收购软件商DemandTec,思杰买Cloud.com等重大事件. 2011年12月4日德国商业管理软件巨头SAP宣布,计划以每股40美元总价34亿美元的价格收购企业软件开发商SuccessFactors.用来发展云计