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博客 ” ,链接:https://blog.itpub.net/17997/viewspace-419060/ ,如需转载,请注明出处,否则将追究法律责任。