【DB筆試面試681】在Oracle中,什麼是塊清除(Block Cleanout)?
- 2019 年 11 月 9 日
- 筆記
♣
題目部分
在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地址。
每個事務處理只分配給一個Undo段,一個Undo段可以同時服務多個事務處理。UPDATE事務的內部流程如下所示:
① 首先當一個事務開始時,需要在Undo段事務表上分配一個事務槽。
② 在數據塊頭部獲取一個ITL事務槽,該事務槽指向Undo段頭的事務槽。
③ 在修改數據之前,需要記錄前鏡像(Before Image)資訊,這個資訊以Undo Record的形式存儲在回滾段中,回滾段頭事務槽指向該記錄。
④ 鎖定修改行,修改行鎖定位(lb-lock byte)指向ITL事務槽。
⑤ 進行數據修改。
在提交事務的時候,如果被修改過的數據塊仍然在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程式設計師面試筆試寶典》,作者:小麥苗
About Me:小麥苗
● 本文作者:小麥苗,只專註於資料庫的技術,更注重技術的運用
● 作者部落格地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列題目來源於作者的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解
● 版權所有,歡迎分享本文,轉載請保留出處