1、传统undo块

在传统情况下Oracle对待undo表空间和普通表空间是一视同仁的,一个事务开始的时候,在相对空闲的undo回滚段的段头块的事务表获取一个槽位,把事务信息写上,有可能:

1.1、段头块发生IO,这个段不在内存里面,就需要通过IO把他放到内存里

1.2、新的回滚块发生IO,又获得一个undo回滚块,有可能undo回滚块不在内存里面,需要发生IO

1.3、正在使用的回滚块发生IO,开始修改数据库,把信息写到回滚块里

在以上这个时候可能出现rollback或者一致性读,要读数据块和回滚块,有可能Oracle在cr的是在构造一致性读块的时候,要读回滚块的时候,这个回滚块已被写到磁盘上,Oracle在对待undo表空间找那个的block即undo表空间的数据块的时候,和对待普通数据文件的数据块是一样的,既然一样它就有可能被dbwr写到磁盘上。被写到磁盘就是干净的buffer,它可能被再次使用,被覆盖掉,下次使用Undo block的时候就需要重新从磁盘上读取。在传统的undo技术里,Oracle将undo表空间和普通表空间同等对待,所以存在刚才重新从磁盘调取的,undo对系统的影响很大,有可能导致数据库系统的性能变得慢一些,这个是传统的劣势。

2、IMU技术产生原因

Oracle根据使用undo块需从磁盘读取的问题推出一个技术较IMU技术(in memory undo),在使用IMU和不使用IMUS的结构里面,undo段以及段头的事务表都有的,唯一不同的地方有了IMU buffer,IMU机制和普通的机制不同,针对每个事务,Oracle在shared pool中分配一个IMU buffer,这个buffer用来记录回滚数据且只记回滚数据。

以前回滚数据在回滚段里面,我们要使用回滚段的时候需要去buffer cache找回滚数据的buffer,这个buffer没有的话需要从磁盘调,需要物流IO(在buffer里没有可用的回滚段缓存的数据块的话,需要找一个undo块缓存到buffer里,这时会有IO,当CR读的时候,这个undo块被写到磁盘,buffer里的这个块也被覆盖后,这时也需要重新读回滚块,发送物流IO)。Oracle使不使用IMU主要影响的不是回滚段段头和事务槽,他们该怎么用还是怎么用,该怎么获取怎么获取,唯一不同的地方是回滚块,原来是当事务需要回滚块的时候去undo表空间找回滚块,会发生物流IO。

现在Oracle一个事务开始的时候,在shared pool里面分一个IMU buffer,然后将所有的回滚信息全部写到IMU buffer里面去,这个IMU buffer是凭空从shared pool

分出来的,不是undo表空间读出来的块。对oracle来讲只要是使用了IMU buffer,当它需要回滚块的时候不需要读undo表空间了,直接从shared pool里面分出IMU buffer,然后回滚信息写到IMU buffer里面去,记住IMU buffer分配以后,回滚信息往里写的时候也要产生redo,因为回滚信息数据写redo,但是IMU buffer减少了物理IO,这就是IMU技术的一个特点,也就是最核心的东西,一个事务开始以后,它需要回滚块的时候,它不是从磁盘读取回滚块,它直接分配imu buffer,直接往里写数据,其他工作方式一样。

3、imu的作用

被修改的数据块指向imu buffer,这个事务修改三个块,产生三个imu node,他们组成imu buffer。

1)回滚的时候,回顾数据直接从内存里IMU调用就可以了,imu不会写到磁盘上,始终在内存里面。(此处可能有误)

2)产生一致性读的时候,直接用imu buffer里的镜像原数据就可以了。

3)imu node也产生redo,既然产生redo,实例崩溃以后这些块也会被恢复处理,也可以实例恢复。

shared pool里面有imu buffer,一个事务分配一个imu buffer,一个buffer里面会有很多node,一个node就相当于一个block。

4、private redo strands

有三个imu buffer,就有三个事务,根据三个事务在shared pool里又分了三个日志去,日志区针对每个imu buffer产生日志,直接在shared pool里面叫private redo strands。imu buffer修改产生的日志,直接写到对应的那个private redo strands日志区里面去,原理的redo日志实在pga里面产生,然后写到log  buffer里面去,再写到redo log日志文件里面去的。针对imu buffer产生的日志不是在pga中,是在private redo strands针对每个imu buffer所产生的一个日志区,日志去的日志内容最终由lgwr写到磁盘。

private redo 机制是配合imu buffer,这个两个都是在shared pool中,imu减少物理IO,提升undo的使用效率。

5、imu最终去处

imu buffer在shared pool产生的日志,用lgwr写到磁盘上,imu buffer里的数据写满的时候,这些数据会被写到undo block里面去,最终它还是要被写到sga的buffer cache里面去,再从undo buffer写到磁盘上。也就是说最终undo数据还是要保存到undo段里面。

产生在imu里的undo数据,imu是个缓存,将来数据库关了缓存就没有了,其实最终的undo数据,是由imu写到buffer cache,然后buffer cache再写到undo段里面去,最终还要写会磁盘。从imu buffer往buffer cache里面写的时候还会继续产生日志,写这个日志比private redo日志就少多了,它进行了优化和合并。

imu和private redo strands两个机制合起来带来的好处:

1)事务在获取undo block的时候速度变快。直接从shared pool的imu中分配块

2)在cr读的时候速度变快,针对cr读,imu可以大幅提高读一致性的速度,但是如果一个事务修改的数据块实在太多的时候,可能存在需要构造的块的镜像数据已经写到undo段里了。

6、如何判断imu是否启用

oracle对imu会自动启用和关闭

使用语句查看一些数值:

select * from v$sysstat where name like '%IMU%';隔断时间查询该语句,比较 commit和flushes的数值,如果一直在增加的话就是启用状态。

MU flushes:当shared pool里面的imu buffer快满了的时候,它会往buffer cache里面写,这个过程就是imu flushes。
IMU commit:当事务提交的时候,shared pool中imu的日志会往磁盘写,imu也往buffer cache中写。
在Rac和和stream里面IMU是被禁用的。

最新文章

  1. SQL Server数据库性能优化技巧
  2. 实战CENTOS6.5安装docker并创建asp.net mvc 5 镜像,运行MVC 网站
  3. 使用nginx-http-concat优化网站响应
  4. docker nexus oss
  5. Exploratory Software Testing
  6. HTML5部分元素
  7. Python教程(2.3)——运算符和类型转换
  8. C#开发模式——单例模式
  9. JBOSS的启动和停止
  10. 2017-12-24 手机编程环境初尝试-用AIDE开发Android应用
  11. Oracle根据主键获取对应表,Oracle根据外键获取相关表
  12. Windows服务System权限下在当前用户桌面创建快捷方式C#实例程序
  13. css 图片文字垂直居中
  14. linux之 sed 基础
  15. ViewHolder的标准写法
  16. Android开发中无处不在的设计模式——动态代理模式
  17. android源码追踪学习 RecipientsEditor
  18. Java反编译工具Luyten介绍
  19. Postman—添加断言和检查点
  20. redis 安装 与错误解决办法

热门文章

  1. Android:Fragment 和 include 标签引入布局的区别
  2. Windows 注册表是什么
  3. Java项目常用的异常处理
  4. LeetCode-19 删除链表倒数第N个结点
  5. VUE学习-渲染函数
  6. python读取Excel指定单元格的值
  7. JRebel for IDEA插件 激活
  8. SpringBoot中常见问题
  9. (app笔记)Memory Fill内存填充
  10. Centos 7.9 部署Kubernetes集群 (基于containerd 运行时)