在Oracle中,什麼是塊清除(Block Cleanout)?程序員
塊清除(Block Cleanout)是指清除存儲在數據塊頭部與鎖相關的信息,其實質是在清除塊上的事務信息,包括數據的行級鎖和ITL信息(包括提交標誌、SCN等),塊清除不須要生成Redo日誌。Oracle的塊清除有兩種:快速塊清除(Fast Commit Cleanout)和延時塊清除(Delayed Block Cleanout)。面試
經過命令「alter system dump undo header '回滾段名稱';」能夠將Undo段頭信息dump出來,能夠很明顯地看到事務表(TRN TBL)信息,其中,狀態(state)爲10表明活動事務,狀態(state)爲9表示INACTIVE。Dba列表示該事務對應的Undo Block Dba地址。sql
每一個事務處理只分配給一個Undo段,一個Undo段能夠同時服務多個事務處理。UPDATE事務的內部流程以下所示:數據庫
① 首先當一個事務開始時,須要在Undo段事務表上分配一個事務槽。微信
② 在數據塊頭部獲取一個ITL事務槽,該事務槽指向Undo段頭的事務槽。網絡
③ 在修改數據以前,須要記錄前鏡像(Before Image)信息,這個信息以Undo Record的形式存儲在回滾段中,回滾段頭事務槽指向該記錄。app
④ 鎖定修改行,修改行鎖定位(lb-lock byte)指向ITL事務槽。ide
⑤ 進行數據修改。性能
在提交事務的時候,若是被修改過的數據塊仍然在Buffer Cache之中,那麼Oracle能夠清除ITL信息,這叫做快速塊清除(Fast Block Cleanout),也叫提交清除(Fast Commit Cleanout)。快速塊清除還有一個限制,當修改的塊數量超過Buffer Cache約10%,則對超出部分再也不進行快速塊清除。學習
在提交事務的時候,若是被修改過的數據塊已經被寫回到數據文件上(或大量修改超出Buffer Cache的10%的部分),再次讀出該數據塊進行修改,顯然成本過於高昂,對於這種狀況,Oracle選擇延遲塊清除(Delayed Block Cleanout),即在提交的時候只會清理Undo Segment Header中的事務表信息,而Data Block上的事務標誌不會清除,等到下一次訪問該Block時再來清除ITL鎖定信息,這就是延遲塊清除。Oracle經過延遲塊清除來提升數據庫性能,加快提交操做。若是Oracle不對塊完成這種延遲清除,那麼COMMIT的處理可能會很長,COMMIT必須從新訪問每個塊,可能還要從磁盤將塊再次讀入內存。在一個OLTP系統中,可能不多看到這種狀況發生,由於OLTP系統的特色是事務都很短小,只會影響爲數很少的一些塊。
若是執行一個大的INSERT、UPDATE或DELETE,會影響數據庫中的許多塊,那麼就有可能在此以後,第一個「接觸」塊的查詢會作延遲塊清除,從而生成Redo日誌,因此,SELECT語句也有可能會產生Redo日誌。
若是有以下的操做,那麼可能會受到塊清除的影響:
l 將大量新數據批量加載到數據倉庫中;
l 在剛剛加載的全部數據上運行UPDATE(產生須要清理的塊);
l 讓別人查詢這些數據
所以,建議在批量加載了數據後,經過運行DBMS_STATS實用程序來收集統計信息,就能天然的完成塊清除工做。Oracle提供了一個內部事件(10203事件)能夠用來跟蹤數據庫的塊清除操做,能夠經過如下命令設置:
1ALTER SYSTEM SET EVENTS '10203 trace name context forever';
本文選自《Oracle程序員面試筆試寶典》,做者:小麥苗
詳細內容能夠添加麥老師微信或QQ私聊。
● 本文做者:小麥苗,只專一於數據庫的技術,更注重技術的運用
● 做者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列題目來源於做者的學習筆記,部分整理自網絡,如有侵權或不當之處還請諒解
● 版權全部,歡迎分享本文,轉載請保留出處
● QQ:646634621 QQ羣:618766405
● 提供OCP、OCM和高可用部分最實用的技能培訓
● 題目解答如有不當之處,還望各位朋友批評指正,共同進步
長按下圖識別二維碼或微信掃描下圖二維碼來關注小麥苗的微信公衆號:xiaomaimiaolhr,學習最實用的數據庫技術。
本文分享自微信公衆號 - DB寶(lhrdba)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。