上篇博文分享了日志缓存文件和日志文件的工作机制,接下来结合更新操作update继续对SGA的DBWR部分进行讲解。
其执行步骤跟查询命令几乎没有任何本质区别,差异在于查询语句查询完返回数据给用户就完工了,而更新语句
还需要继续工作。update命令在数据缓冲区内修改完数据后,会启用DBWR进程,完成更新的数据从内存中刷入到磁
盘。因为磁盘才是真正存储数据的地方,否则一断电,数据在内存中就消失了。
问题来了,Update animal set count=25我们执行完这条指令后提交,数据缓存区的数据会立即被DBWR进程写
进磁盘吗?如果不是,那么什么时候执行呢?
答案是不一定,COMMIT无法决定数据何时从数据缓存区刷入到数据区。数据缓存区的数据每提交一次就刷出一
次,性能太低了。Oracle根据一定的规则来促成这个动作,即缓存区的数据积累到一定的程度,再批量刷入到磁盘
中,这样一来就高效得多了。所以到底什么时候执行不一定,如果非要给个答案的话,那就是数据量积累到Oracle指
定的限额的时候。
问题又来了,说到性能就不得不提安全性。安全和效率往往是不能兼顾的,如果突然断电缓冲区中的数据
安全是如何保障的呢?
Oracle的安全机制就需要上篇博文中提到的日志缓存区和日志文件了。日志缓存区也是在内存区怕断电,但是日
志文件是永久保存在物理磁盘的,它可不怕断电!因此,COMMIT时日志缓存区就会把要操作的动作写到日志文件中进
行保存,断电后可以根据磁盘中的日志文件重新操作一遍就可以了。这样一来,Oracle就不一定非要将数据从数据缓
存区写到磁盘了,既保证了高性能又兼顾了安全性。
Oracle数据缓冲区是批量刷出的,那么是否数据量越大越好呢?
答案肯定为否。为什么呢?很多时候我们要考虑一个平衡点,批量刷出的量比较小,性能就会降低,但是断电后
开机恢复的时间短;反之如果批量刷出的量比较大,性能是提高了,但是数据恢复的时间也就更长了。所以要考虑一
个平衡点。那么这个平衡点如何来把握呢?这就需要进程CKPT上场了。什么时候将数据缓存区数据写到磁盘的动作是
由进行CKPT来触发的,CKPT触发DBWR写出。
关于CKPT是如何触发DBWR写出的,欢迎继续关注下篇博文的讲解。