单条commit与多条commit对系统产生的IOPS影响的探讨



本文中姓名与敏感号码脱敏声明:

出于对个人隐私的保护,对专家的真名进行脱敏,采用人称名代替,对于手机号和QQ号,部分用“X”符号替换。

1、国内资深性能优化专家老白先生(笔名:白鳝,人称老白)提问


单条COMMIT和多条COMMIT,对系统产生的IOPS有什么影响,有多大影响,为什么?

2、小弟黎俊杰(网名:踩点)应答


黎俊杰134XXXXXXX1(389338XX3) 9:41:57

单条commit的IOPS肯定大于多条commit,每commit一次,LGWR就会有一个日志块做写入,即最少发生一次IOPS;多条一起commit,如果多条记录的大小小于一个块大小的话,即也只是发生一次IOPS,而通常一条记录即达到一个块大小的情况比较小。不知是不是这样理解,请徐总指教。

3、老白先生回复


老白138XXXXXXX0(62XX5) 9:44:24

首先分析下批量插入的IO产生有那几块,

然后评估下大概多大

小弟想,即然老白先生这么回复,肯定说明我的回答不够完整,好,看,继续往下,看我来深入一下。

4、小弟黎俊杰(网名:踩点)接着应答


黎俊杰134XXXXXXX1(389338XX3) 2015/1/5 9:51:34

批量插入的情况下,主要应该是LGWR和DBWR两部分产生IO

5、老白先生再次回复


老白138XXXXXXX0(62XX5) 2015/1/5 9:56:20

如果问题要分析的再细一点,还要考虑索引的影响

老白此话一出,小弟我立即自拍脑袋三下,插入数据,如果表上有索引,肯定会维护索引的,在此题目的回答上,我怎么就没有把思维扩宽些,插入数据维护索引也会引起IO,而只是单纯围绕着题目中的“插入”这个具体的事件,而不考虑该事件还会引发的相关事件呢。看来,在专家面前,不得不承认自己与专家的差距啊。

下面来老实回答一下老白吧。往下啦…

6、中间插曲


Hu jun军150XXXXXXX8(275475005) 2015/1/5 9:57:21

一般批量插入的数据量都较大

Hu jun军是我的哥们,是子衿优化团队的一枚实力大将,看来这哥们是忙中偷闲了一下啊。

7、未等俺喘气,老白先生继续指导


老白138XXXXXXX0(62XX5) 2015/1/5 9:57:35

IO产生有几大块,格式化数据块产生的预读,索引修改产生的单块读,DBWR写入,LGWR写日志

8、小弟的肺腑回复


黎俊杰134XXXXXXX1(389338XX3) 2015/1/5 9:57:42

刚才考虑时,确实没有想到索引上来

不得不说,我当时的回答确实没有想到索引上来,在此长知识了。不过还好,问题回答上了一半,说明了产生IO主要是因为DBWR与LGWR

9、再看专家的过人之高言


老白138XXXXXXX0(62XX5) 2015/1/5 9:58:00

还有索引大批量修改产生的排序可能产生的临时表空间读写DIRECT PATH

看到这段指导之言,不得不说,“专家就是专家”,问题分析的全面与深入,让小弟发自从内心的佩服!

小弟今天真是长知识了,与专家交流的感觉真是好,也真希望与专家的交流能够更多些。

本文作者:黎俊杰(网名:踩点),从事”系统架构、操作系统、存储设备、数据库、中间件、应用程序“六个层面系统性的性能优化工作

欢迎加入 系统性能优化专业群,共同探讨性能优化技术。群号:258187244

时间: 2024-08-27 05:19:24

单条commit与多条commit对系统产生的IOPS影响的探讨的相关文章

相同更改数据量的前提下,单次COMMIT和多次COMMIT对日志空间浪费的影响对比

LGWR进程按照顺序写在线日志,中间不会跳跃,而且LGWR进程不会在同一个日志快写2次,即使一次写入的日志快只占几个字节,下次不会再用了,这就造成日志空间的浪费.Oracle做一次Commit,就会触发LGWR进程进行日志缓冲到日志文件的写入操作,因此可以说更改相同数据量的前提下,如果提交过于频繁,产生的日志可能就会越多,即使第一次Commit占用的日志块仍可以存储下一次需要写入的日志缓冲,那么下一次Commit会再次占用一个新的日志块. 实验: 1.系统的日志块大小是512字节. SQL> s

无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&

git commit -m 与 git commit -am的区别

字面解释的话,git commit -m用于提交暂存区的文件:git commit -am用于提交跟踪过的文件 要理解它们的区别,首先要明白git的文件状态变化周期,如下图所示 工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪.已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区 下面以一个实例说明 在项目文件夹中新增一个文件如'a.txt'时,该文件处于untracked未跟踪状态.未跟踪状态的文件是无

Linux系统硬盘的IOPS测试

******************************************************************************************* 版权所有: www.foutime.com  深圳市方泰智能科技有限公司 通道锁 逃生锁 一卡通 楼宇对讲 停车场 ******************************************************************************************* 什么是IOPS?

[转] git merge 将多个commit合并为一条之--squash 选项

[FROM] https://blog.csdn.net/themagickeyjianan/article/details/80333645 1.一般的做法(直接git merge) Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如: $ git merge another $ git checkout another # modify, commit, modify, commit ... $ git checkout master $ git

JSP与Servlet之后台页面单条删除与多条删除的页面跳转之实现

单条删除页面跳转 1.首先打开JSP页面,找到删除 2.这个时候要把它改成servlet的URL,并决定要传给后台什么数据,例如我需要传一个待删数据的ID id并不是什么见不得人的东西(而且是后台也不需要太多讲究),所以把信息附带在URL上就可以了,(basePath指的是WEB APP的根目录,在JSP里加上下面的代码就可以用了 <% String path = request.getContextPath(); String basePath = request.getScheme() +

UIKit的手风琴菜单,单条展开和多条同时展开

这个也要进来看看哈. 记得加多个属性时的用法就可以了. 因为官网提供太多的SAPMLE啦.. http://www.getuikit.net/docs/accordion.html <div class="uk-accordion" data-uk-accordion="{collapse: false,showfirst: false}"> 使用手风琴菜单,为容器元素添加 uk-accordion 类和 data-uk-accordion 属性就行.然

一条SQL引发系统out of memory PostgreSQL

错误描述 (1) Postgres执行的原SQL: select COALESCE(m1.place_id, m2.place_id, m3.place_id) as place_id, concat_ws('``', m1.rich_attributes, m2.rich_attributes, m3.rich_attributes) as rich_attributes from (SELECT place_external_points.place_id, string_agg(conca

[android] 插入一条记录到系统短信应用里

谷歌市场上有这些应用,模拟短信,原理就是把数据插入到短信应用的数据库里 获取ContentResolver对象,通过getContentResolver()方法 调用resolver对象的insert(uri,values)方法,参数:Uri对象,ContentValues对象 调用ContentValues对象的put(key,value)方法,key就是上一节的字段,val值,date是时间戳,调用系统的时间System.currentTimeMillies()方法 使用线程来实现过几秒后再