Dump Block是否会读入Buffer Cache?

今天忽然有个疑问,如果我们执行alter system dump datafile # block #的话Oracle是否会先把block读入到buffer cache中呢?先打电话问了一下泡在广州温柔乡里面的eygle,他说应该不会,可以直接读取数据文件的。

为了确认,我还是自己测试了一下,结果证明eygle的记忆还是对的。

简略说一下测试步骤,超级简单。

1。重启一下数据库,这样buffer cache中几乎就没什么用户数据了,方便测试
2。随便找一张表看看是在哪个file哪个block里面
SQL> select header_file,header_block
2 from dba_segments
3 where segment_name=’T1′;

HEADER_FILE HEADER_BLOCK
———– ————
4 19
3。T1表在数据文件4中,第一个block是19,检查v$bh,看看这个block有没有在buffer cache中
SQL> select count(*)
2 from v$bh
3 where file# = 4 and block# = 19;

COUNT(*)
———-
0
4。OK,目前buffer cache中没有这个block,作一次dump再看看有没有
SQL> alter system dump datafile 4 block 19;

System altered

SQL> select count(*)
2 from v$bh
3 where file# = 4 and block# = 19;

COUNT(*)
———-
0
5。至此验证了作block dump不会把数据块先读入buffer cache,好,继续作一次select看看,这次一定是读进buffer cache了
SQL> select * from ops$kamus.t1;

N
———-

SQL> select count(*)
2 from v$bh
3 where file# = 4 and block# = 19;

COUNT(*)
———-
1

小知识
1. v$bh视图保存着buffer cache中每一个block的信息。
2. dba_segments视图中一个ASSM类型segment的header_block是从它的PAGETABLE SEGMENT HEADER算起的,并不包括前面用于控制free block的两个位图块(FIRST LEVEL BITMAP BLOCK和SECOND LEVEL BITMAP BLOCK)。