在传统的undo管理模式中,Oracle对undo和data block是一视同仁。这样大致会有三种弊端:
1)事务开始时,存放事务表的段头不在内存,server process需要将此i/o上来
2)存放旧值的回滚块不在内存
3)rollback或者CR读的时候,所需的回滚块被DBWn写到磁盘,oracle也需将此i/o,可能会产生大量的consistent gets和physical reads
UNDO 也是受redo保护的,因此更是造成了额外的开销。
10g中引入private redo 和 IMU。 提高了CR的速度,减少了I/O.
IMU也就是in memory undo。实际上是在shared pool中开辟一块区域来存放undo信息。通常情况下oracle会尽量把新生成的undo放入 shared pool中的undo buffer。这个行为不受redo保护。
在以下两种情况,undo数据会被写到回滚块:
a. IMU buffer空间不足时,会发生IMU flush,将undo flush到database_buffer_cache里的回滚块中
b. LGWR将redo写到redo log file时,会发生IMU commit,将private redo strands写到redo log file,将IMU buffer写到回滚块