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 池的原因。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • httprunner(9)运行测试用例的方式总结「建议收藏」

    httprunner(9)运行测试用例的方式总结「建议收藏」前言用过pytest的小伙伴都知道,pytest的运行方式是非常丰富的,可以说是你想怎么运行怎么运行,想运行哪些运行哪些,那httprunner是否同样可以呢?运行用例的各种方式运行指定路径的用

  • 堆排序算法——C/C++

    堆排序算法——C/C++堆排序1、算法思想堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。2、实现原理要实现从小到大的排序,就要建立大顶堆,即父节点比子节点都要大。2.1、初始化数组,创建大顶堆。大顶堆的创建从下往上比较,不能直接用无序数组从根节点比较,否则有的不符合大顶堆的定义。…

  • alibaba String转json转map

    alibaba String转json转mapalibabaString转json转mappom <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>调用HashMaphash

  • kl散度和交叉熵的区别_散度的概念

    kl散度和交叉熵的区别_散度的概念通用的说,熵(Entropy)被用于描述一个系统中的不确定性(theuncertaintyofasystem)。在不同领域熵有不同的解释,比如热力学的定义和信息论也不大相同。要想明白交叉熵(CrossEntropy)的意义,可以从熵(Entropy)-&gt;KL散度(Kullback-LeiblerDivergence)-&gt;交叉熵这个顺序入手。当然,也有多种解释方法…

    2022年10月23日
  • bootcamp您的磁盘未能分区_bootcamp无法调整分区大小

    bootcamp您的磁盘未能分区_bootcamp无法调整分区大小朋友把macbookpro拿来让我帮删除下用bootcamp安装的win10系统,于是就打开mac进入实用工具->磁盘工具->点击左侧磁盘列表中的MacintoshHD根目录,右侧选择分区,然后点击右侧分区布局列表中的BOOTCAMP,点下面的『-』号,再点移除,系统提示『您的磁盘不能恢复为单一的分区』。    遇到问题找度娘,结果查询出来的结果是,需要重新安装MAC系统,『NT

  • es6删除对象的属性_ES6删除对象中的某个元素「建议收藏」

    &lbrack;原&rsqb;XAF添加日期筛选下拉选择1.ListView添加日期筛选下拉选择,选择指定,可指定日期范围2.CodeusingDevExpress.Data.Filtering;usingDevExpress.ExpressA…Android照相机应用前言Android在设计架构的时候,采用了mashup(混搭)的设计理念,也就是说一切都是…

发表回复

您的电子邮箱地址不会被公开。

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