Oracle 塊清除,以及ORA-01555錯誤

來源:互聯網
上載者:User

我們知道Oracle的塊清除有兩種:

1:快速塊清除(fast commit cleanout);

2:延時塊清除(delayed block cleanout);

資料庫塊的最前面有一個“開銷”空間(overhead),這裡會存放該塊的一個事務表,對於鎖定了該塊中某些資料的各個“實際”事務,在這個事務表中都有一個相應的條目。

1)首先當一個事務開始時,需要在復原段事務表上分配一個事務槽;

2)在資料區塊頭部獲得一個ITL事務槽,該事務槽指向復原段段頭的事務槽;

3)在修改資料之前,需要在復原段中記錄前鏡像資訊,復原段頭事務槽指向該記錄;

4)  鎖定修改行,修改行鎖定位(lb-lock block)指向ITL事務槽;

5)  資料修改可以進行。

COMMIT時候Oracle需要將復原段上的事務表資訊標記為非活動,以便空間可以重用;此外所做的一個操作是塊清除(Block cleanout),如果事務修改的某些塊還在緩衝區快取中,會清除塊首部的ITL事務資訊(包括提交標誌、SCN等)和鎖定資訊。

在與我們的事務相關的提交列表中,Oracle會記錄已修改的塊列表(每個列表可以有20個塊指標),Oracle會根據需要分配多個這樣的列表,直至達到某個臨界點。如果我們修改的塊加起來超過了塊緩衝區快取大小的10%,Oracle 會停止為我們分配新的列表。例如,如果緩衝區快取設定為可以緩衝3,000個塊,Oracle 會為我們維護最多300個塊。

COMMIT時,Oracle會通過這些列表找到塊,如果塊仍在塊緩衝區中,Oracle會執行一個很快的清理,這叫做快速塊清除(FAST BLOCK CLEANOUT)。

所以,只要我們修改的塊數沒有超過緩衝中總塊數的10%,而且塊仍在塊緩衝區中(如果已經被寫回到資料檔案上再次讀出該資料區塊進行修改成本過於昂貴),Oracle就會在COMMIT時清理這些塊。否則,就會延遲塊清除到下次訪問該塊的時候。通過延遲塊清除(DELAYED BLOCK CLEANOUT)可以提高資料庫的效能,加快提交操作。

所以如果執行一個大的INSERT、UPDATE或DELETE,影響資料庫中的許多塊,就有可能在此之後,第一個“接觸”塊的查詢會需要修改某些塊首部並把塊弄髒,產生REDO日誌,會導致DBWR把這些塊寫入磁碟。 (--所以說select 語句也有可能會產生redo日誌)

如果Oracle不對塊完成這種延遲清除,那麼COMMIT的處理可能很長,COMMIT必須重新訪問每一個塊,可能還要從磁碟將塊再次讀入(它們可能已經重新整理輸出)。

  • 1
  • 2
  • 下一頁

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.