commit的误解

来源:互联网 发布:嘉鱼网络推广经理招聘 编辑:程序博客网 时间:2024/06/02 05:51

1.大事务(DML处理大批量数据)后的commit会比小事务后的commit

   要搞清楚这个问题,首先要理解commit时,oracle要做哪些工作:

  1LGWRlog buffer中所有剩余的重做记录写进联机重做日志文件(log file),为事务新生成一个SCN,并将这个SCN也写进重做日志文件,此时该事务从V$TRASACTION中删除,该事务完成;

  2)将该会话持有的锁V$LOCK释放掉;

  3)简单标记回滚段事务已提交;

虽然大事务与小事务产生的redo量有区别,但是LGWR的自动写log buffer的机制(日志缓冲区占1/3DBWR写脏缓冲区)会让这种差别不会很大,所以说不论大事务还是小事务,commit耗时是相差无几的。         

                                                                                    

2.DML大批量数据时,分批commit会比一次commit更快

 首先要搞清楚commit会消耗哪些资源:

1)  增加客户端与服务器端的通信量,commit越多通信量越大;

2)  提交时,会话将等待lgwrlogbufferlogfile

但是为什么有时候分批提交确实能提高效率呢?我认为关键是在回滚段上,因为大事务一次提交需要很大的回滚段,当undo空间不足,自动扩展将会很大程度上影响效率。分批提交的话,就会及时将回滚段中不活动(commit)的数据块回收,从而能有效的利用undo空间,避免因undo空间不足,自动扩展造成的性能损耗。(不过注意,并不是commit后就能立即回收回滚段,系统回收回滚段具有不确定性)。

所以,一个大事务是应该一次提交还是分批提交,关键在于IOundo空间利用的均衡考虑,不能一味简单的认为分批提交好。我认为最重要还是要考虑业务逻辑,一般不要分批提交。


原创粉丝点击