|
zhouyh139 发表于 2013-7-11 08:34 ![]()
大家都在讨论有没有队列,是否可以提供一个方法,可以供大家测试一下
buffer pin一定是有队列的,至于这个队列是不是跟enq锁一样,有FIFO我不确定。
buffer pin不是latch,不是mutex,不会在cpu上做spin
buffer pin的队列结构很容易被dump,被证明:
select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fn, dbms_rowid.rowid_block_number(rowid) bl, wxh_tbd.object_id,rowid from wxh_tbd where rownum<4;
FN BL OBJECT_ID ROWID
---------- ---------- ---------- ------------------
7 906227 20 AAAF2kAAHAADdPzAAA
7 906227 46 AAAF2kAAHAADdPzAAB
7 906227 28 AAAF2kAAHAADdPzAAC
新个3个session 分别执行:
test@DLSP>begin
2 for i in 1 ..40000000 loop
3 UPDATE wxh_tbd SET object_name=46 where rowid='AAAF2kAAHAADdPzAAB';
4 commit;
5 end loop;
6 end;
7 /
test@DLSP>begin
2 for i in 1 ..40000000 loop
3 UPDATE wxh_tbd SET object_name=28 where rowid='AAAF2kAAHAADdPzAAC';
4 commit;
5 end loop;
6 end;
7 /
test@DLSP>begin
2 for i in 1 ..40000000 loop
3 UPDATE wxh_tbd SET object_name=20 where rowid='AAAF2kAAHAADdPzAAA';
4 commit;
5 end loop;
6 end;
7 /
然后dump.
alter system dump datafile 7 block 906227;
注意dump的次数要多一点,因为buffer pin是很快的,很可能你dump的时候,没抓到。
查看dump 文件,我截取几个:
BH (0xa37d8c9b8) file#: 7 rdba: 0x01cdd3f3 (7/906227) class: 1 ba: 0xa33c7e000
set: 182 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 0,0
dbwrid: 1 obj: 23972 objn: 23972 tsn: 4 afn: 7 hint: f
hash: [0xa37d8c5a8,0xadfdd5188] lru: [0xa37d8c5e0,0xae63edb58]
ckptq: [NULL] fileq: [NULL] objq: [NULL] objaq: [NULL]
use: [0xae5f89658,0xae5f89658] wait: [NULL] fast-cr-pins: 1
st: CR md: SHR tch: 0
cr: [scn: 0x0.8a4a8801],[xid: 0x0.0.0],[uba: 0x0.0.0],[cls: 0x0.8a4a8801],[sfl: 0x0],[lc: 0x0.8a4a8801]
flags: only_sequential_access
BH (0x9f7ebfa68) file#: 7 rdba: 0x01cdd3f3 (7/906227) class: 1 ba: 0x9f5cd0000
set: 184 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 0,0
dbwrid: 3 obj: 23972 objn: 23972 tsn: 4 afn: 7 hint: f
hash: [0x9ffea3908,0xadfdd5188] lru: [0x9f7ebf0a0,0x9f7ebef70]
obj-flags: object_ckpt_list
ckptq: [0x9f7ebee88,0x9f7ebf0e8] fileq: [0xae64a4100,0xae64a4100] objq: [0xab46b0220,0xab46b0220] objaq: [0xab46b0200,0xab46b0200]
use: [0xae5f89658,0xae5f89658] wait: [0xaf5ef8e28,0xaf5ef8e28]
st: XCURRENT md: EXCL fpin: 'kdswh11: kdst_fetch' tch: 7
flags: buffer_dirty mod_started block_written_once redo_since_read
flush_after_writing
change state: COMPLETE
change count: 1
LRBA: [0x44d.49bdc.0] LSCN: [0x0.8ad148b0] HSCN: [0x0.8ada8c13] HSUB: [2]
BH (0xa37db0618) file#: 7 rdba: 0x01cdd3f3 (7/906227) class: 1 ba: 0xa34042000
set: 184 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 0,0
dbwrid: 3 obj: 23972 objn: 23972 tsn: 4 afn: 7 hint: f
hash: [0xadfdd5188,0xadfdd5188] lru: [0xa37db0830,0xa37db05d0]
ckptq: [NULL] fileq: [NULL] objq: [0xab46b0210,0xa37db05f8] objaq: [0xab46b0200,0xa37db0608]
st: XCURRENT md: NULL fpin: 'kdswh11: kdst_fetch' tch: 85
flags: only_sequential_access
LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [65535]
请关注红色部分。
这个就是buffer pin的队列。
dump 的3个截取,第一个只有use队列,第二个use wait队列都存在,第三个由于我们没捕获到,这2个队列完全不存在。
|
|