ASSM中的三级位图块,L1、L2和L3,第一个L3是段头。
L3中保存L2的地址,L2保存L1的地址,L1中记录数据块的空闲状态。
插入操作在寻找可用块时,Oracle会依次查找L3、L2和L1。在L3中寻找L2是根据 L2 Hint for inserts: 0x0140061a,而从L2中寻L1是通过process id用hash算法得到的hash值来实现的。从L1中寻数据块也是通过process id hash后的值来实现。
L3包括多个L2,L2包括多个L1。
(1)创建了一个log_table表,查询到该表的段头块地址,dump出来
select header_file,header_block from dba_segments where segment_name='LOG_TABLE' and wner='FB';
HEADER_FILE HEADER_BLOCK
----------- ------------
5 1563
alter system dump datafile 5 block 1563;
*** 2013-05-20 10:16:44.765
*** SERVICE NAME:(SYS$USERS) 2013-05-20 10:16:44.734
*** SESSION ID:(138.166) 2013-05-20 10:16:44.734
Start dump data blocks tsn: 6 file#: 5 minblk 1563 maxblk 1563
buffer tsn: 6 rdba: 0x0140061b (5/1563)
scn: 0x0000.00106bda seq: 0x01 flg: 0x00 tail: 0x6bda2301
frmt: 0x02 chkval: 0x0000 type: 0x23= PAGETABLE SEGMENT HEADER
Hex dump of block: st=0, typ_found=1
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0140061a —————————— 将选择的L2地址
Last Level 1 BMB: 0x01400619
Last Level II BMB: 0x0140061a
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 1 obj#: 53506 flag: 0x10000000
Inc # 0
Extent Map
-----------------------------------------------------------------
0x01400619 length: 8
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x01400619 Data dba: 0x0140061c
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x0140061a —————————————— L2块地址
再把L2 dump出来
Start dump data blocks tsn: 6 file#: 5 minblk 1562 maxblk 1562
buffer tsn: 6 rdba: 0x0140061a (5/1562)
scn: 0x0000.00106bd9 seq: 0x01 flg: 0x04 tail: 0x6bd92101
frmt: 0x02 chkval: 0x516e type: 0x21=SECOND LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of Second Level Bitmap Block
number: 1 nfree: 1 ffree: 0 pdba: 0x0140061b
Inc #: 0 Objd: 53506
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x01400619 Free: 5(若为1,则L1中数据块已经满了) Inst: 1 ———————— L1块地址
--------------------------------------------------------
再把L1块DUMP出来
Start dump data blocks tsn: 6 file#: 5 minblk 1561 maxblk 1561
buffer tsn: 6 rdba: 0x01400619 (5/1561)
scn: 0x0000.00106bda seq: 0x01 flg: 0x04 tail: 0x6bda2001
frmt: 0x02 chkval: 0x472e type: 0x20=FIRST LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 1 parent dba: 0x0140061a poffset: 0
unformatted: 5 total: 8 first useful block: 3
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 3
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 53506
HWM Flag: HWM Set
Highwater:: 0x0140061c ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x01400619 Length: 8 Offset: 0
0:Metadata 1:Metadata 2:Metadata 3:unformatted
4:unformatted 5:unformatted 6:unformatted 7:unformatted
--------------------------------------------------------
End dump data blocks tsn: 6 file#: 5 minblk 1561 maxblk 1561
可以看到L1中包含8个数据块的地址,5个块都是未格式化的数据块
通过实验可验证到:L1指向块地址的数量与其段(如表)的大小有关,随着表数据的增加,L1指向块地址数量逐步增加,当表中没有数据时,L1可能指向块地址数量为8个或16个或64个等等(上面是自动分配的EXTENT,为64K,指向的块地址数量是8个,通过把EXTENT设置为2M,发现L1指向块地址数量是64个,L1的初始块指针数量可能与区的初始大小有关,具体还需要实验一下),当表中数据小于64M时,L1中最多指向64个数据块的地址,大于64M后,最多指向256个数据块的地址(需要实验一下)。
下面是我把表数据增加后,dump出来的L1块
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0140061a poffset: 2
unformatted: 0 total: 16 first useful block: 1
owning instance : 1
instance ownership changed at 05/20/2013 11:58:25
Last successful Search 05/20/2013 11:58:25
Freeness Status: nf1 1 nf2 0 nf3 0 nf4 7
Extent Map Block Offset: 4294967295
First free datablock : 8
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 53506
HWM Flag: HWM Set
Highwater:: 0x01400649 ext#: 5 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 43
mapblk 0x00000000 offset: 5
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x01400639 Length: 8 Offset: 0
0x01400641 Length: 8 Offset: 8
0:Metadata 1:FULL 2:FULL 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:75-100% free 9:0-25% free 10:75-100% free 11:75-100% free
12:75-100% free 13:75-100% free 14:75-100% free 15:75-100% free
变成16个了
L3中保存L2的地址,L2保存L1的地址,L1中记录数据块的空闲状态。
插入操作在寻找可用块时,Oracle会依次查找L3、L2和L1。在L3中寻找L2是根据 L2 Hint for inserts: 0x0140061a,而从L2中寻L1是通过process id用hash算法得到的hash值来实现的。从L1中寻数据块也是通过process id hash后的值来实现。
L3包括多个L2,L2包括多个L1。
(1)创建了一个log_table表,查询到该表的段头块地址,dump出来
select header_file,header_block from dba_segments where segment_name='LOG_TABLE' and wner='FB';
HEADER_FILE HEADER_BLOCK
----------- ------------
5 1563
alter system dump datafile 5 block 1563;
*** 2013-05-20 10:16:44.765
*** SERVICE NAME:(SYS$USERS) 2013-05-20 10:16:44.734
*** SESSION ID:(138.166) 2013-05-20 10:16:44.734
Start dump data blocks tsn: 6 file#: 5 minblk 1563 maxblk 1563
buffer tsn: 6 rdba: 0x0140061b (5/1563)
scn: 0x0000.00106bda seq: 0x01 flg: 0x00 tail: 0x6bda2301
frmt: 0x02 chkval: 0x0000 type: 0x23= PAGETABLE SEGMENT HEADER
Hex dump of block: st=0, typ_found=1
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0140061a —————————— 将选择的L2地址
Last Level 1 BMB: 0x01400619
Last Level II BMB: 0x0140061a
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 1 obj#: 53506 flag: 0x10000000
Inc # 0
Extent Map
-----------------------------------------------------------------
0x01400619 length: 8
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x01400619 Data dba: 0x0140061c
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x0140061a —————————————— L2块地址
再把L2 dump出来
Start dump data blocks tsn: 6 file#: 5 minblk 1562 maxblk 1562
buffer tsn: 6 rdba: 0x0140061a (5/1562)
scn: 0x0000.00106bd9 seq: 0x01 flg: 0x04 tail: 0x6bd92101
frmt: 0x02 chkval: 0x516e type: 0x21=SECOND LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of Second Level Bitmap Block
number: 1 nfree: 1 ffree: 0 pdba: 0x0140061b
Inc #: 0 Objd: 53506
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x01400619 Free: 5(若为1,则L1中数据块已经满了) Inst: 1 ———————— L1块地址
--------------------------------------------------------
再把L1块DUMP出来
Start dump data blocks tsn: 6 file#: 5 minblk 1561 maxblk 1561
buffer tsn: 6 rdba: 0x01400619 (5/1561)
scn: 0x0000.00106bda seq: 0x01 flg: 0x04 tail: 0x6bda2001
frmt: 0x02 chkval: 0x472e type: 0x20=FIRST LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 1 parent dba: 0x0140061a poffset: 0
unformatted: 5 total: 8 first useful block: 3
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 3
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 53506
HWM Flag: HWM Set
Highwater:: 0x0140061c ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x01400619 Length: 8 Offset: 0
0:Metadata 1:Metadata 2:Metadata 3:unformatted
4:unformatted 5:unformatted 6:unformatted 7:unformatted
--------------------------------------------------------
End dump data blocks tsn: 6 file#: 5 minblk 1561 maxblk 1561
可以看到L1中包含8个数据块的地址,5个块都是未格式化的数据块
通过实验可验证到:L1指向块地址的数量与其段(如表)的大小有关,随着表数据的增加,L1指向块地址数量逐步增加,当表中没有数据时,L1可能指向块地址数量为8个或16个或64个等等(上面是自动分配的EXTENT,为64K,指向的块地址数量是8个,通过把EXTENT设置为2M,发现L1指向块地址数量是64个,L1的初始块指针数量可能与区的初始大小有关,具体还需要实验一下),当表中数据小于64M时,L1中最多指向64个数据块的地址,大于64M后,最多指向256个数据块的地址(需要实验一下)。
下面是我把表数据增加后,dump出来的L1块
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x0140061a poffset: 2
unformatted: 0 total: 16 first useful block: 1
owning instance : 1
instance ownership changed at 05/20/2013 11:58:25
Last successful Search 05/20/2013 11:58:25
Freeness Status: nf1 1 nf2 0 nf3 0 nf4 7
Extent Map Block Offset: 4294967295
First free datablock : 8
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 53506
HWM Flag: HWM Set
Highwater:: 0x01400649 ext#: 5 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 43
mapblk 0x00000000 offset: 5
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x01400639 Length: 8 Offset: 0
0x01400641 Length: 8 Offset: 8
0:Metadata 1:FULL 2:FULL 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:75-100% free 9:0-25% free 10:75-100% free 11:75-100% free
12:75-100% free 13:75-100% free 14:75-100% free 15:75-100% free
变成16个了
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27135177/viewspace-765107/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27135177/viewspace-765107/