+++++buffer cache 深度解析( 二 )


只是一个逻辑上的概念 。每个hash 都是通过不同的hash chain而体现出来的 。每个hash chain都会由一个cachelatch来管理其并发操作 。
而对于 来说,每一个数据块在被读入 cache时,都会先在 cache中构造一个 , 与数据块一一对应 。包含的主要信息有:
1) 该数据块在 cache中实际的内存地址 。就是上图中的虚线箭头所表示的意思 。
2) 该数据块的类型,包括data、 、undo 、undo block等等 。
3) 该 所在的hash chain,是通过在 里保存指向前一个 的指针和指向后一个 的指针的方式实现的 。
4) 该 所在的LRU、LRUW、CKPTQ等链表(这些链表我们后面都会详细说明) 。也是通过记录前后 指针的方式实现 。
5) 当前该 所对应的数据块的状态以及标记 。
6) 该 被访问(touch)的次数 。
7) 正在等待该 的进程列表( list)和正在使用该 的进程列表(user list) 。(难道正在使用该 和正在等待该 的进程表会皴法在当前 中?对,正在使用的进程存在里面,可以理解,为什么正在等待的进程也在里面呢?)
cache中,缺省的hash 的数量或者说缺省有多少条hash chain链表,是由一个隐藏参数:
ts决定的 。至于该参数的取值,在我的测试中,8i下,该参数缺省为×2;但是到了9i以后,该参数似乎取的是小于且最接近于×2的素数 。
2.2 转储 cache
就象实例中的其他内存结构一样,提供了可以将 cache转储到跟踪文件的方法 。方法如下:
ALTER SESSION SET EVENTS 'immediate trace name buffers level level';
这里的level有很多值,分别可以转储 cache中的不同的内容 。level的可选值包括:
1 只转储
2 在level 1的基础上再转储数据块头
3 在level 2的基础上再转储数据块内容
4 转储 和hash chain
5 在level 1的基础上再转储数据块头和hash chain
6 在level 2的基础上再转储数据块内容和hash chain
8 转储 和hash chain以及users/链表
9 在level 1的基础上再转储数据块头、hash chain以及users/链表
10 在level 2的基础上再转储数据块内容、hash chain以及users/链表
我们创建一个简单的测试表,然后看看转储出来的 是什么样子的 。
SQL> create table buffer_test(id number);SQL> select object_id from dba_objects where object_name='BUFFER_TEST'; OBJECT_ID----------7087SQL> insert into buffer_test values(1);SQL> commit;
这时我们知道表的是7987,同时,该表中只有2个block具有数据 。1个是 ,另一个就是实际存放了1这个值的数据块 。接着我们把 转储出来:
SQL> ALTER SESSION SET EVENTS 'immediate trace name buffers level 1';
到所定义的目录下,找到跟踪文件并打开,可以看到类似下面的信息,这里我们列出前两个 以及我们建立的为7087的表所对应的 的内容:
BH (0x637F0720) file#: 1 rdba: 0x004011ed (1/4589) class 1 ba: 0x63570000…………………………………hash: [64be8000,65a5eab4] lru: [637f06ac,637f0824]LRU flags: moved_to_tailckptq: [NULL] fileq: [NULL]…………………………………BH (0x64BE8000) file#: 0 rdba: 0x00000000 (0/0) class 0 ba: 0x64800000…………………………………hash: [65a5eab4,637f0720] lru: [64be8104,65aa3f0c]…………………………………BH (0x63BEC0A0) file#: 6 rdba: 0x0180b00a (6/45066) class 1 ba: 0x638B0000set: 3 dbwrid: 0 obj: 7087 objn: 7087hash: [65a9ccd4,65a9ccd4] lru: [63bec1a4,63bec02c]ckptq: [65abceb4,63bec66c] fileq: [65abcfbc,63becd10]st: XCURRENT md: NULL rsop: 0x00000000 tch: 1flags: buffer_dirty gotten_in_current_mode redo_since_readLRBA: [0xe9.229.0] HSCN: [0x0000.00122967] HSUB: [1] RRBA: [0x0.0.0]BH (0x63BECAE8) file#: 6 rdba: 0x0180b009 (6/45065) class 4 ba: 0x638CC000set: 3 dbwrid: 0 obj: 7087 objn: 7087hash: [65a9cbcc,65a9cbcc] lru: [63becbec,63beca74]ckptq: [637fc250,63becdc4] fileq: [65ab8ad0,63becdcc]st: XCURRENT md: NULL rsop: 0x00000000 tch: 2flags: buffer_dirty gotten_in_current_mode redo_since_readLRBA: [0xe9.21b.0] HSCN: [0x0000.00122965] HSUB: [1] RRBA: [0x0.0.0]…………………………………