Oracle insert into太慢

Oracle insert into太慢insertinto太慢insertinto太慢?Roger带你找真凶运营商客户的计费库反应其入库程序很慢,应用方通过监控程序发现主要慢在对于几个表的insert操作上。按照我们的通常理解,insert应该是极快的,为什么会很慢呢?而且反应之前挺好的。这有点让我百思不得其解。通过检查event也并没有发现什么奇怪的地方,于是我通过10046跟踪了应用的入库程序,如下应用方反应比较慢…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

insert into太慢

insert into太慢?Roger 带你找真凶
运营商客户的计费库反应其入库程序很慢,应用方通过监控程序发现主要慢在对于几个表的insert操作上。按照我们的通常理解,insert应该是极快的,为什么会很慢呢?而且反应之前挺好的。这有点让我百思不得其解。通过检查event也并没有发现什么奇怪的地方,于是我通过10046 跟踪了应用的入库程序,如下应用方反应比较慢的表的insert操作,确实非常慢,如下所示:
这里写图片描述
*我们可以发现,insert了4579条数据,一共花了27.41秒;其中有24.02秒是处于等待的状态。而且等待事件为顺序读.很明显这通常是索引的读取操作,实际上检查10046 trace 裸文件,发现等待的对象确实是该表上的2个index。
同时我们从上面10046 trace可以看出,该SQL执行之所以很慢,主要是因为存在了大量的物理读,其中4579条数据的insert,物理读为4534;这说明什么问题呢? 这说明,每插入一条数据大概产生一个物理读,而且都是index block的读取。很明显,通过将该index cache到keep 池可以解决该问题。 实际上也确实如此,通过cache后,应用反馈程序快了很多。
那么对该问题,这里其实有几个疑问,为什么这里的SQL insert时物理读如此之高? oracle的keep pool对于缓存对象的清理机制是如何的?
下面我们通过一个简单的实验来进行说明。
首先我们创建2个测试表,并创建好相应的index,如下所示:
这里写图片描述
创建表和索引并插入数据
这里写图片描述
从前面的信息我们可以看出,object_name上的index其实聚簇因子比较高,说明其数据分布比较离散。

接着我们现在将index都cache 到keep 池中,如下:
这里写图片描述
这里需要注意的是,仅仅执行alter 命令是不够的,我们还需要手工将index block读取到keep池中,如下:
这里写图片描述
第一次读取并检查
这里写图片描述
第二次读取并检查
这里写图片描述
第三次读取并检查
这里写图片描述
我们可以大致看出,db keep pool 也是存在LRU的,而且对于block的清除机制是先进先出原则。那么为什么前面的问题中,insert会突然变慢呢?

下面我们来进行3次insert 测试。

第一次
这里写图片描述
使用10046事件跟踪
这里写图片描述
第二次
这里写图片描述
第三次
这里写图片描述
使用10046事件跟踪
这里写图片描述
从测试来看,随着表的数据越来越大,insert的效率会越来越低,也其实主要在于index的问题。我们可以发现,3次测试过程中,物理读越来越大,而且db file sequential read的等待时间分别从0.5秒,增加到0.56秒,最后增加到1.07秒。 为什么会出现这样的情况呢?

随着表数据的日益增加,导致表上的index也不断增大,同时index的离散度比较高,这样就导致每次insert时,oracle在进行index block读取时,可能在buffer cache中都无法命中相应的block;这样就会导致每次读取需要的index block时,可能都要进行物理读,这势必会导致性能问题的出现。同时默认的default buffer cache pool虽然也可以缓存index 块,但是也要同时缓存其他的数据块,这样很容易导致相关的index block被从buffer cache pool中移走。所以这也是前面为什么需要将index cache到keep 池的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160951.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月25日 下午3:00
下一篇 2022年7月25日 下午3:00


相关推荐

  • 矩阵向量中两两间欧式距离计算[通俗易懂]

    矩阵向量中两两间欧式距离计算[通俗易懂]目标:希望通过的矩阵运算就能得出矩阵向量中两两之间的欧式距离欧氏距离公式:一般而言,我们常见的欧式距离计算公式如下:a,b对应的是两组不同的向量dist(a,b)=(a1−b1)2+(a2−b2)2+⋅⋅⋅(an−bn)2dist(a,b)=\sqrt{(a_1-b_1)^{2}+(a_2-b_2)^{2}+···(a_n-b_n)^{2}}dist(a,b)=(a1​−b1​)2…

    2022年6月19日
    37
  • 外贸进出口贸易海关报关管理_进口报关单贸易国怎么填

    外贸进出口贸易海关报关管理_进口报关单贸易国怎么填附加费分摊?发票张数?发票号码???分摊原则单?项?摊□确定选择子项分摊???单张同类摊□确定?执行。。。。。。??单项分摊附加费即直接选择子项将费用加入,修改数据。单项分摊附加费即直接选择子项将费用加入,修

    2026年2月6日
    6
  • Ubuntu12.04下使用virtualbox4.3.12 amd64安装XP系统教程

    Ubuntu12.04下使用virtualbox4.3.12 amd64安装XP系统教程

    2021年12月14日
    55
  • sequelize常见用法

    sequelize常见用法sequelize 常见用法查询表中某个字段不重复的所有数据 awaitModel findAll attributes sequelize fn DISTINCT sequelize col col name alias 批量删除 awaitModel destroy where id Op in ids 分页 排序 模糊查询搜索 查询状态 Menu 表自身与自身关联 Menu hasMany Me

    2026年3月17日
    1
  • python之内置函数

    一、数学运算类二、集合类操作三、逻辑判断四、反射compile(source,filename,mode[,flags[,dont_inherit]])五、IO操作

    2021年12月18日
    51
  • java用什么软件_Java编程什么软件最好用?

    java用什么软件_Java编程什么软件最好用?原标题:Java编程什么软件最好用?“工欲善其事必先利其器”,想要学好Java编程开发,除了要有好的学习资源之外,还要有一套适合自己的Java编程软件,好的编程软件能极大提高你的学习和工作效率。那么,Java编程软件有哪些?Java编程用什么软件好呢?下面整理了一些华清Java学院为大家推荐的Java编程软件。Java编程软件有哪些?1、JDKJDK是java初学时用的,比较麻烦,建议开始学习J…

    2022年5月10日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号