10G R2後,ORACLE提供了一個新參數commit_write來控制用戶端commit後,ORACLE寫日誌的行為。這個參數值有四種組合。
· immediate , wait
注釋:Server process在提交時使用semctl發送訊號給LGWR,通知其Flush Log Buffer,並等待LGWR發回的訊息(semtimedop).
LGWR在接收到訊息後, Flush log buffer到磁碟,通過semctl發送訊號給Server Process,告知其commit成功.
· immediate , nowait
· batch , wait
注釋:Server Process在提交時使用semctl發送訊號給LGWR,要求其提交後通知此Server Process進程,並等待此訊息返回(運行semtmdop)
LGWR在經過一定的內部時間(Timeout)後, Flush Log Buffer到磁碟,並使用semctl通知此Server Process進程
· batch , nowait
傳統的,我們的預設寫方式都是immediate , wait。代表server process立即通知LGWR重新整理日誌,LGWR重新整理完log buffer後通知server process,COMMIT成功。
如果用了nowait選項,your session doesn’t send a message to lgwr at all。不管是batch,還是immediate,在指定nowait時候,事務都是在in the near future進行提交,
而不是立即提交。因為,由可知:Immediate nowait和Batch nowait的redo synch writes次數都是0,即沒有立即進行日誌寫。也就是nowait選項表示,沒寫完就返回“commit complete”。
如果你的系統的資料非常的重要,不能丟失任何的資料,那麼需要確認wait選項,如果你的事務都是非常的小,那麼batch wait將會稍微提高你的事務效率,減少了redo blocks的浪費。如果你的系統的資料丟失一點沒關係,那麼batch nowait是你最好的選擇。這種組合對於redo的size,redo的浪費,以及使用者的等待時間都是最小的。
batch和immediate有個關鍵的不同,immedaite把commit當成是一個單獨的change vector。可知:immediate比batch多了一倍的redo entries。這一倍的實際內容就是commit本身產生的。也就是,batch的含義是commit本身的提交不需要以單條redo reocord的形式出現在redo log裡,而immediate含義是commit本身也以一條單獨的redo record記錄出現在redo
log裡。
但不管是不是batch,ORACLE都會默默的進行group commit。
08:30:19 hr@ORCL (^ω^) show parameter commit_writNAME TYPE VALUE------------------------------------ ---------- ------------------------------commit_write string
預設是immediate、wait。我們可以有三種方式改變之:
1)執行個體層級
alter system set commit_write=batch,wait;
2)會話層級
alter session set commit_write=batch,wait;
3)語句層級
commit write batch wait;