|
原帖由 carcase 于 2010-8-27 09:54 发表 ![]()
to 小V
----------------------------------------
现在都是incremental checkpoint,引入的checkpoint queue的概念,所以commit太频繁不会对checkpoint有太大影响,其实是对redo buffer到redo log太过频繁,redo写更不上。
--------------------------------------
提交(COMMIT) (好像是eygle的书上看来的,^_^)
1.Oracle产生一个SCN
2.在回滚段事务表中标记该事务状态为commited
3.LGWR Flush Log Buffer到日志文件
4.如果此时数据块仍然在Buffer Cache中,那么SCN将被记录到Block Header上,这被称为快速提交(fast commit)
如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交SCN并写回到Block Header上。这被称为延迟块清除(delayed block cleanout)。
commit 过多
1.频繁生成scn --会不会增加redo的量?? 应该会,看下面的实验
2.频繁修改回滚段事务表中的标记,但是回滚段也被释放出来了
3.频繁触发lgwr,而lgwr写有一个叫组提交的,就是说唤醒lgwr写之前,之前的所有redo都被写入磁盘,这一步增加了写磁盘的量,但是一起写速度是不是也会有所增加呢??
另外一个问题,redo 是什么时候从pga中拷贝到log buffer中的?? 是commit后,还是有其他触发条件??
如果是commit后,那么频繁触发lgwr,就会造成 频繁申请redo copy latch,redo allocation latch,造成log file sync等待
4.频繁更新block header,这个会有消耗吗??
多commit生成的commit 大于一起commit的量
不错!
不过 对于 “redo 是什么时候从pga中拷贝到log buffer中的??”,是这样的么?
redo 怎么会在 pga 呢? 我觉得 redo 信息一直都是在 redo log buffer 里面的吧!
[ 本帖最后由 红叶DBA 于 2010-8-27 11:19 编辑 ] |
|