|
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,这个会有消耗吗??
下面是 关于 1的 实验
TEST@ sun>select * from t;
A B
---------- ----------
9 1
9 2
TEST@ sun>create table t2 as select * from t;
表已创建。
TEST@ sun>select * from t2;
A B
---------- ----------
9 1
9 2
TEST@ sun>select a.sid,b.name,a.VALUE from v$sesstat a,v$statname b,(select distinct sid from v$myst
at) c
2 where a.statistic#=b.statistic# and a.sid=c.sid and b.name='redo size';
SID NAME VALUE
---------- ------------------------------ ----------
142 redo size 20108
TEST@ sun>update t set a=5;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>update t set a=6;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>update t set a=7;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>update t set a=8;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>update t set a=9;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>update t set a=10;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>update t set a=11;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>update t set a=12;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>update t set a=13;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>update t set a=14;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>
TEST@ sun>select a.sid,b.name,a.VALUE from v$sesstat a,v$statname b,(select distinct sid from v$myst
at) c
2 where a.statistic#=b.statistic# and a.sid=c.sid and b.name='redo size';
SID NAME VALUE
---------- ------------------------------ ----------
142 redo size 29108
TEST@ sun>update t2 set a=5;
已更新2行。
TEST@ sun>update t2 set a=6;
已更新2行。
TEST@ sun>update t2 set a=7;
已更新2行。
TEST@ sun>update t2 set a=8;
已更新2行。
TEST@ sun>update t2 set a=9;
已更新2行。
TEST@ sun>update t2 set a=10;
已更新2行。
TEST@ sun>update t2 set a=11;
已更新2行。
TEST@ sun>update t2 set a=12;
已更新2行。
TEST@ sun>update t2 set a=13;
已更新2行。
TEST@ sun>update t2 set a=14;
已更新2行。
TEST@ sun>commit;
提交完成。
TEST@ sun>
TEST@ sun>select a.sid,b.name,a.VALUE from v$sesstat a,v$statname b,(select distinct sid from v$myst
at) c
2 where a.statistic#=b.statistic# and a.sid=c.sid and b.name='redo size';
SID NAME VALUE
---------- ------------------------------ ----------
142 redo size 34768
TEST@ sun>select (29108-20108) 分开commit的redo量 ,(34768-29108) 一起commit的redo量 from dual;
分开COMMIT的REDO量 一起COMMIT的REDO量
------------------ ------------------
9000 5660
多commit生成的commit 大于一起commit的量 |
|