日志管理-9

这次我们要讨论即使写入内容完全一样,写入时所需的数据块数也会因为写入REDO日志文件的时间不同而有所改变的现象。

──写入是以数据块为单位──

之前已经介绍过LGWR(对在线REDO日志文件执行写入的进程)是以OS的数据块(512byte) 为单位执行写入的,这样做是为了提高性能。因此为了更新6byte,结果会消耗1K byte的空间,其中有544 byte是因为以512byte为单位执行写入——即因为格式原因导致浪费。下面是关于REDO日志的基本概念“change vector”以及“REDO record”的说明。

※change vector
表示对数据库内某一个数据块所做的一个变更,change vector容纳了变更的数据块的地址(DBA)以及更新后的数据。

※REDO record
记录单一数据库变更的一系列change vector构成REDO record,有些transaction会产生不只一个REDOrecord,每个REDO record各有一连串的change vector。

假如执行了10件更新处理,会产生10笔REDO record,每个REDO record里都有多个change vector,在创建这个REDO record(change vector)的过程中会产生大量的未使用(浪费)的空间。换句话说,由于创建REDO record(change vector)时执行写入是以数据块为单位的,所以会产生空间浪费。

──写入的数据块数会因为写入时间而改变──
*************************************************************
※处理1
瞬间执行下面两个UPDATE语句,中间没有间隔。

●SQL语句
Update work03 set ename = 'haneda' where empno = 1002 ;
Update work03 set ename = 'haneda' where empno = 1003 ;
Commit ;

●统计信息(差)
Redo size                    652
Redo wastage                 340
Redo blocks written            2
*************************************************************

*************************************************************
※处理2
执行下面两个UPDATE语句,中间有间隔。

●SQL语句
Update work03 set ename = 'haneda' where empno = 1002 ;
【间隔】
Update work03 set ename = 'haneda' where empno = 1003 ;
Commit ;

●统计信息(差)
Redo size                    652
Redo wastage                 836
Redo blocks written            3
*************************************************************

请注意看各自的统计信息,处理1和处理2执行的内容更新是相同的,可是统计讯息竟然有差异。以前就曾经说明过,LGWR不是每次发生transaction就会对REDO日志文件执行写入,而是在某些时间启动。请想想启动的时间是哪些时候,只要想一想就会发现导致上述差异的原因了。

下次会继续说明写入时所需的数据块数会因为写入REDO日志文件的时间不同而有所改变的现象。
请使用浏览器的分享功能分享到微信等