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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 背包问题-动态规划java实现代码

    背包问题-动态规划java实现代码背包问题-动态规划背包问题是如今面试流行的面试题之一,我们可用动态规划解题

    2022年7月26日
    17
  • java list详解_java集合List解析[通俗易懂]

    java list详解_java集合List解析[通俗易懂]作为一个Developer,Java集合类是我们在工作中运用最多的、最频繁的类。相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求;Java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。在程序运行时,Java集合可以动态的进行扩展,随着元素的增加而扩大。在Java中,集合类通常存在于java.util包中。Java集合主要由2大体系构成,分别是C…

    2022年7月9日
    18
  • 双机热备方案设计

    1什么是双机热备方案  双机热备就是使用互为备份的两台服务器共同执行同一服务,其中一台主机为工作机(PrimaryServer),另一台主机为备份机(StandbyServer),保证系统不间断的运行。双机热备软件就是实现上述功能的软件产品。双机热备针对的是服务器的临时故障所做的一种备份技术,通过双机热备,来避免长时间的服务中断,保证系统长期、可靠的服务。  企事业机构的信息化建设已…

    2022年4月6日
    45
  • id门禁卡复制到手机_手机NFC也可以刷ID卡门禁?无聊测试居然成功了![通俗易懂]

    id门禁卡复制到手机_手机NFC也可以刷ID卡门禁?无聊测试居然成功了![通俗易懂]前段时间换了个K20pro,有NFC功能后手又痒了,就想折腾一下NFC的日常使用。小区的门禁前几个月刚换成了亲邻开门,可以用微信小程序开门,但每次都要拿手机出来点几下(特别是手机提着东西的时候),还是没有手机接触式开门方便。拿出家里的门禁卡放手机背面,没反应,我NFC应该没问题呀!换另外一台华为手机还是没反应!上网一查,我家的门禁卡居然是ID卡!但还是不死心,在小米钱包里虚拟了一张门卡,放到小区门…

    2022年6月10日
    1.6K
  • 盘点五款好用的项目管理软件

    盘点五款好用的项目管理软件好用的项目管理软件有哪些?对于很多从事项目开发与设计的团队都会有这样的需求,一款优秀的项目进度管理软件在企业项目实施中有着极为重要的作用,它伴随着项目计划、定义、监控、控制以及确认交付的全部过程。那么面对市场上众多的企业项目进度管理软件,有哪些项目管理软件比较好呢?本文将盘点分析市面上常见几款甘特图软件,以帮助大家能够找到适合自己的工具。|EdrawProject这是一款专业的项目管…

    2022年5月29日
    50
  • 皮亚诺曲线_皮亚诺余项o什么意思

    皮亚诺曲线_皮亚诺余项o什么意思概述皮亚诺曲线是一种奇怪的曲线,只要恰当选择函数和由定义的一条连续的参数曲线,当参数t在0,1区间取值时,曲线将遍历单位正方形中所有的点,得到一条充满空间的曲线。就一条联系而又不可导的曲线。目录皮亚诺曲线一些不同观点皮亚诺曲线皮亚诺(Peano)曲线是一条能够填满正方形的曲线。在传统概念中,曲线的数维是1维,正方形是2维。1890年,意大利数学…

    2025年8月15日
    4

发表回复

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

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