塊清除的理解

byfree發表於2008-08-05

Thomas Kyte《Expert Oracle Database Architecture》學習記錄

塊清除(block cleanout)形成是因為oracle的locks資訊儲存在block頭部,當下一次訪問塊時,可能必須clean it out(不是每次都要,fast commit cleanout不要),並且消除事務資訊,這樣就會產生redo(修改事務資訊的redo)。

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

下面把DB_CACHE_SIZE設定為一個很低的值4MB,這足以放下512個8KB的塊(塊大小是8KB)

SQL> create table t (x char(2000), y char(2000), z char(2000));

Table created.

SQL> set autotrace traceonly statistics;
SQL> insert into t select 'x', 'y', 'z' from all_objects where rownum <= 500;

500 rows created.


Statistics
----------------------------------------------------------
       2431  recursive calls
       4625  db block gets
       5098  consistent gets
        626  physical reads
    3303100  redo size
        666  bytes sent via SQL*Net to client
        607  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
         40  sorts (memory)
          0  sorts (disk)
        500  rows processed

SQL> commit;

Commit complete.

SQL> select * from t;

500 rows selected.


Statistics
----------------------------------------------------------
         29  recursive calls
          1  db block gets
       1104  consistent gets
        518  physical reads
      36528  redo size
      13250  bytes sent via SQL*Net to client
        763  bytes received via SQL*Net from client
         35  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
        500  rows processed
       
SQL> /

500 rows selected.


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        538  consistent gets
        529  physical reads
          0  redo size
      13250  bytes sent via SQL*Net to client
        763  bytes received via SQL*Net from client
         35  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
        500  rows processed

第二次select就不產生redo了。

如果執行一個大的INSERT(如上所述)、UPDATE或DELETE,這種塊清除行為的影響最大,它會影響資料庫中的許多塊(快取中10%以上的塊都會完成塊清除)。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17997/viewspace-419060/,如需轉載,請註明出處,否則將追究法律責任。

相關文章