您好,欢迎访问一九零五行业门户网

Oracle中的IMU详解

1、概述 oracle 10g inmemory undo新特性: 通过以前的介绍,可知道undo的管理方式和常规的数据管理方式是相同的,当进行数据修改时,会在buffer中创建前镜像,同时会记录相应的redo,然后这些undo数据同样会写出到undo segment上,当进行一致性读或回滚时,
1、概述
oracle 10g inmemory undo新特性:
通过以前的介绍,可知道undo的管理方式和常规的数据管理方式是相同的,当进行数据修改时,会在buffer中创建前镜像,同时会记录相应的redo,然后这些undo数据同样会写出到undo segment上,当进行一致性读或回滚时,可能会产生大量的consistentgets和physical reads。注意到这里,undo会产生redo信息,又会写undo segment,进而又可能产生大量读取i/o,这些都是资源密集型操作。如果能够缩减undo在这些环节的redo与undo写出,那么显然就可以极大地提升数据库性能,减少资源的消耗和使用。
从oracle10g开始,oracle在数据库中引入了in memory undo(可以被缩写为imu)的新技术,使用这一技术,数据库会在共享内存中(shared pool)开辟独立的内存区域用于存储undo信息,这样就可以避免undo信息以前在buffer cache中的读写操作,从而可以进一步的减少redo生成,同时可以大大减少以前的undo segment的操作。imu中数据通过暂存、整理与收缩之后也可以写出到回滚段,这样的写出提供了有序、批量写的性能提升。
imu机制与前面日志提到的pvrs紧密相关,由于每个imu buffer的大小在64~128kb左右,所以仅有特定的小事务可以使用,每个事务会被绑定到一个独立的空闲的imu buffer,同时相关的redo信息会写入pvrs中,同样每个imu buffer会由一个独立的in memory undo latch保护,当imu buffer或pvrs写满之后,数据库需要写出imu中的信息。
一个新引入的隐含参数可以控制该特性是否启用,这个参数是_in_memory_undo,在oracle 10g中这个参数的缺省值是true(不同版本和平台参数的初始设置可能不同):
sys@tqgzs> @gethidpar.sql
enter value for par: _in_memory_undo
old   4: and x.ksppinm like '%&par%'
new   4: and x.ksppinm like '%_in_memory_undo%'
name                          value               describ
------------------------------ --------------------------------------------------------------------------------
_in_memory_undo               true                make in memory undo for top level transactions
imu的内存在shared pool中分配,回想一下redo log buffer的内存使用与功能,实际上imu技术在某种程度上也是参考了log buffer的机制,通过以下查询可以获得系统当前分配的imu内存:
sys@tqgzs> select * from v$sgastat where name ='kti-undo';
pool        name                               bytes
------------ ------------------------------ ----------
shared pool kti-undo                         1235304
in memory undo池缺省的会分配3个,用以提供更好的并发:
sys@tqgzs> @gethidpar.sql
enter value for par: _imu_pool
old   4: and x.ksppinm like '%&par%'
new   4: and x.ksppinm like '%_imu_pool%'
name                          value               describ
------------------------------ --------------------------------------------------------------------------------
_imu_pools                    3                   in memory undo pools
imu的使用信息,如提交次数可以通过v$sysstat视图查询:
sys@tqgzs> select name,value from v$sysstat where name like '%commits';
name                                  value
------------------------------ -------------
usercommits                           2877
imucommits                            1549
新的内存buffer通过in memory undo latch来进行保护:
sys@tqgzs> select name,gets,misses,immediate_gets,sleeps
  2  from v$latch_children where name like '%undo latch';
name                                gets     misses immediate_gets    sleeps
------------------------------ ---------- ---------- -------------- ----------
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undo latch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   0         0             0          0
in memory undolatch                   4         0             2          0
in memory undolatch                 214         0             25         0
in memory undolatch                6118         0           3064         0
in memory undolatch                4230         0           1084         0
in memory undolatch               39583         0          2842          0
18 rows selected.
除了前面提到的,还有几个隐含参数与imu有关:
·_recursive_imu_transactions:控制递归事务是否使用imu,该参数缺省值为false;
sys@tqgzs> @gethidpar.sql
enter value for par: _recursive_imu_transactions
old   4: and x.ksppinm like '%&par%'
new   4: and x.ksppinm like '%_recursive_imu_transactions%'
name                          value               describ
------------------------------ --------------------------------------------------------------------------------
_recursive_imu_transactions   false               recursive transactions may be imu
·_db_writer_flush_imu:控制是否允许dbwr将imu事务的降级为常规事务,并执行undo segment的写出操作,缺省值为true。
sys@tqgzs> @gethidpar.sql
enter value for par: _db_writer_flush_imu
old   4: and x.ksppinm like '%&par%'
new   4: and x.ksppinm like '%_db_writer_flush_imu%'
name                          value               describ
------------------------------ --------------------------------------------------------------------------------
_db_writer_flush_imu          true                if false, dbwr will not downgrade imu txns for aging
此外,在rac环境中,imu不被支持。
经过不同版本oracle技术的不断演进,oracle的内存管理已经和以前大为不同,现在buffer cache、shared pool、log buffer的内容正在不断交换渗透,redo、undo数据都可以部分地存储在共享池中,oracle 11g的result cache也被记录在shared pool当中。
- the end -
其它类似信息

推荐信息