Oracle体系结构(三)---DBWR机制

来源:互联网 发布:淘宝银色遮光布有毒吗 编辑:程序博客网 时间:2024/05/22 11:31


上篇博文分享了日志缓存文件和日志文件的工作机制,接下来结合更新操作update继续对SGA的DBWR部分进行讲解。



  其执行步骤跟查询命令几乎没有任何本质区别,差异在于查询语句查询完返回数据给用户就完工了,而更新语句

还需要继续工作。update命令在数据缓冲区内修改完数据后,会启用DBWR进程,完成更新的数据从内存中刷入到磁

盘。因为磁盘才是真正存储数据的地方,否则一断电,数据在内存中就消失了。



  问题来了,Update animal set count=25我们执行完这条指令后提交,数据缓存区的数据会立即被DBWR进程写

磁盘吗?如果不是,那么什么时候执行呢?

  答案是不一定,COMMIT无法决定数据何时从数据缓存区刷入到数据区。数据缓存区的数据每提交一次就刷出一

次,性能太低了。Oracle根据一定的规则来促成这个动作,即缓存区的数据积累到一定的程度,再批量刷入到磁盘

中,这样一来就高效得多了。所以到底什么时候执行不一定,如果非要给个答案的话,那就是数据量积累到Oracle指

定的限额的时候。


  问题又来了,说到性能就不得不提安全性。安全和效率往往是不能兼顾的,如果突然断电缓冲区中的数据

全是如何保障的呢?

  Oracle的安全机制就需要上篇博文中提到的日志缓存区和日志文件了。日志缓存区也是在内存区怕断电,但是日

志文件是永久保存在物理磁盘的,它可不怕断电!因此,COMMIT时日志缓存区就会把要操作的动作写到日志文件中进

行保存,断电后可以根据磁盘中的日志文件重新操作一遍就可以了。这样一来,Oracle就不一定非要将数据从数据缓

存区写到磁盘了,既保证了高性能又兼顾了安全性。



    Oracle数据缓冲区是批量刷出的,那么是否数据量越大越好呢?

  答案肯定为否。为什么呢?很多时候我们要考虑一个平衡点,批量刷出的量比较小,性能就会降低,但是断电后

开机恢复的时间短;反之如果批量刷出的量比较大,性能是提高了,但是数据恢复的时间也就更长了。所以要考虑一

个平衡点。那么这个平衡点如何来把握呢?这就需要进程CKPT上场了。什么时候将数据缓存区数据写到磁盘的动作是

由进行CKPT来触发的,CKPT触发DBWR写出。



  关于CKPT是如何触发DBWR写出的,欢迎继续关注下篇博文的讲解。





1 0