ASSM 的三级位图结构

自动段空间管理(ASSM),它首次出现在Oracle920里(在920以前,段空间的管理方式叫做MSSM,它是由连接列表freelist来完成的,因为freelist存在串行的问题,因此容易引起段头的争用与空间的浪费)。有了ASSM,连接列表freelist被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block)。使用ASSM的一个巨大优势就是能够减轻缓冲区忙等待(buffer busy wait)。

我们来看看ASSM的管理结构是怎么样的:

--准备工作:

SQL> create table test1(id int,name varchar2(20));

Table created.

SQL> insert into test1 values(0,'dd');

1 row created.

SQL> commit;

SQL> alter table test1 allocate extent(size 1M);

Table altered.

 

--获取这个segment是从哪一个extent开始的:

SQL> select EXTENT_ID , FILE_ID , BLOCK_ID , BLOCKS from dba_extents where segment_name='TEST1';

 EXTENT_ID    FILE_ID    BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
     0        5         128      8
     1        5         136      8
     2        5         144      8
     3        5         152      8
     4        5         160      8
     5        5         168      8
     6        5         176      8
     7        5         184      8
     8        5         192      8
     9        5         200      8
    10        5         208      8
    11        5         216      8
    12        5         224      8
    13        5         232      8
    14        5         240      8
    15        5         248      8
    16        5         256    128

17 rows selected.

 

--获取段头的位置

SQL> select header_block,header_file from dba_segments where segment_name='TEST1' and owner='SS';

HEADER_BLOCK HEADER_FILE
------------ -----------
     130           5

 

我们发现第一extent的块号是128,而段头的块号是130,那么128和129这两个块到底做什么用的?


dump 块128的信息:
Start dump data blocks tsn: 6 file#:5 minblk 128 maxblk 128
Block dump from cache:
Dump of buffer cache at level 4 for tsn=6, rdba=20971648
BH (0x57bf7f2c) file#: 5 rdba: 0x01400080 (5/128) class: 8 ba: 0x57b52000
set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 77037 objn: 77037 tsn: 6 afn: 5 hint: f
hash: [0x5db05a2c,0x5db05a2c] lru: [0x533f76bc,0x57fea7b4]
lru-flags: on_auxiliary_list
ckptq: [NULL] fileq: [NULL] objq: [NULL]
st: FREE md: NULL tch: 0 lfb: 33
flags:
cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 6 rdba: 0x01400080 (5/128)
scn: 0x0000.00113bc5 seq: 0x02 flg: 0x04 tail: 0x3bc52002
frmt: 0x02 chkval: 0xd021 type: 0x20=FIRST LEVEL BITMAP BLOCK --在这儿发现原来是L1的bitmap块
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x009E9600 to 0x009EB600
9E9600 0000A220 01400080 00113BC5 04020000 [ .....@..;......]
9E9610 0000D021 00000000 00000000 00000000 [!...............]
9E9620 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
9E9640 00000000 00000000 00000000 00000004 [................]
9E9650 FFFFFFFF 00000008 00000003 00000010 [................]
9E9660 00010002 00000000 00000000 00000000 [................]
9E9670 00000005 00000003 530045F5 530045F5 [.........E.S.E.S]
9E9680 00000000 0021000A 000002B7 00000003 [......!.........]
9E9690 01400081 00000000 00000000 00000008 [..@.............]
9E96A0 00000008 01400088 00000000 00000000 [......@.........]
9E96B0 00000000 00000005 00000000 00000001 [................]
9E96C0 00012CED 001139E1 00000000 01400080 [.,...9........@.]
9E96D0 00000008 00000000 01400088 00000008 [..........@.....]
9E96E0 00000008 00000000 00000000 00000000 [................]
9E96F0 00000000 00000000 00000000 00000000 [................]
Repeat 8 times
9E9780 00000000 00000000 00000000 55551511 [..............UU]
9E9790 00000000 00000000 00000000 00000000 [................]
Repeat 485 times
9EB5F0 00000000 00000000 00000000 3BC52002 [............. .;]
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x01400081 poffset: 0  --L1的块的父块地址是0x01400081,换算成10进制是129
unformatted: 8 total: 16 first useful block: 3
owning instance : 1
instance ownership changed at 02/16/2014 13:00:37
Last successful Search 02/16/2014 13:00:37
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 5

Extent Map Block Offset: 4294967295
First free datablock : 3
Bitmap block lock opcode 3
Locker xid: : 0x000a.021.000002b7
Inc #: 0 Objd: 77037
HWM Flag: HWM Set
Highwater:: 0x01400088 ext#: 0 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset: 0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x01400080 Length: 8 Offset: 0
0x01400088 Length: 8 Offset: 8
--当前L1管理的地址是2个区,16个块,有8个块还没被格式化
0:Metadata 1:Metadata 2:Metadata 3:75-100% free
4:75-100% free 5:75-100% free 6:75-100% free 7:75-100% free
8:unformatted 9:unformatted 10:unformatted 11:unformatted
12:unformatted 13:unformatted 14:unformatted 15:unformatted
--------------------------------------------------------

继续dump L1的父地址的块129信息:

Start dump data blocks tsn: 6 file#:5 minblk 129 maxblk 129
Block dump from cache:
Dump of buffer cache at level 4 for tsn=6, rdba=20971649
BH (0x57fea708) file#: 5 rdba: 0x01400081 (5/129) class: 9 ba: 0x57d48000
set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 77037 objn: 77037 tsn: 6 afn: 5 hint: f
hash: [0x5db40714,0x5db40714] lru: [0x57bf7fd8,0x56be25b0]
lru-flags: on_auxiliary_list
ckptq: [NULL] fileq: [NULL] objq: [NULL]
st: FREE md: NULL tch: 0 lfb: 33
flags:
cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 6 rdba: 0x01400081 (5/129)
scn: 0x0000.00113bc5 seq: 0x10 flg: 0x04 tail: 0x3bc52110
frmt: 0x02 chkval: 0xa942 type: 0x21=SECOND LEVEL BITMAP BLOCK --在这儿发现原来129号块是L2的块号
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00578600 to 0x0057A600
578600 0000A221 01400081 00113BC5 04100000 [!.....@..;......]
578610 0000A942 00000000 00000000 00000000 [B...............]
578620 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
578640 00000000 00000000 00000000 01400082 [..............@.]
578650 0000000A 0000000A 00000000 00000001 [................]
578660 0021000A 000002B7 00012CED 00000001 [..!......,......]
578670 00000000 01400080 00010005 01400090 [......@.......@.]
578680 00010005 014000A0 00010005 014000B0 [......@.......@.]
578690 00010005 014000C0 00010005 014000D0 [......@.......@.]
5786A0 00010005 014000E0 00010005 014000F0 [......@.......@.]
5786B0 00010005 01400100 00010005 01400101 [......@.......@.]
5786C0 00010005 00000000 00000000 00000000 [................]
5786D0 00000000 00000000 00000000 00000000 [................]
Repeat 497 times
57A5F0 00000000 00000000 00000000 3BC52110 [.............!.;]
Dump of Second Level Bitmap Block
number: 10 nfree: 10 ffree: 0 pdba: 0x01400082 --它的父地址是82,换算成10进制是130,即使段头的地址
Inc #: 0 Objd: 77037
opcode:1
xid:
L1 Ranges : --当前L2块能管理的L1的范围。oracle的每一个进程在v$process中都有一个对应的pid,oracle通过pid来进行hash再来进行分配L1,从而达到大并发的效果
--------------------------------------------------------
0x01400080 Free: 5 Inst: 1
0x01400090 Free: 5 Inst: 1
0x014000a0 Free: 5 Inst: 1
0x014000b0 Free: 5 Inst: 1
0x014000c0 Free: 5 Inst: 1
0x014000d0 Free: 5 Inst: 1
0x014000e0 Free: 5 Inst: 1
0x014000f0 Free: 5 Inst: 1
0x01400100 Free: 5 Inst: 1
0x01400101 Free: 5 Inst: 1

--------------------------------------------------------

继续dump L2的父地址(即段头)的块130信息:

Start dump data blocks tsn: 6 file#:5 minblk 130 maxblk 130
Block dump from cache:
Dump of buffer cache at level 4 for tsn=6, rdba=20971650
BH (0x53bf290c) file#: 5 rdba: 0x01400082 (5/130) class: 4 ba: 0x53a82000
set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 77037 objn: -1 tsn: 6 afn: 5 hint: f
hash: [0x56be2580,0x5db1c214] lru: [0x53bead80,0x57ffb0b4]
ckptq: [NULL] fileq: [NULL] objq: [NULL]
st: CR md: NULL tch: 1
cr: [scn: 0x0.114112],[xid: 0x0.0.0],[uba: 0x0.0.0],[cls: 0x0.114112],[sfl: 0x0],[lc: 0x0.0]
flags:
cr pin refcnt: 0 sh pin refcnt: 0
BH (0x56be2504) file#: 5 rdba: 0x01400082 (5/130) class: 4 ba: 0x5680e000
set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 77037 objn: 77037 tsn: 6 afn: 5 hint: f
hash: [0x5db1c214,0x53bf2988] lru: [0x57fea7b4,0x583fabbc]
lru-flags: on_auxiliary_list
ckptq: [NULL] fileq: [NULL] objq: [NULL]
st: FREE md: NULL tch: 0 lfb: 33
flags:
cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 6 rdba: 0x01400082 (5/130)
scn: 0x0000.00113bcc seq: 0x01 flg: 0x04 tail: 0x3bcc2301
frmt: 0x02 chkval: 0x86f4 type: 0x23=PAGETABLE SEGMENT HEADER --发现类型是段头了
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00F07600 to 0x00F09600

....省略一些没有用的信息

Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 17 #blocks: 256 --一共有17个区,256个块,16个区有8个块,一个区有128个块,在下面的Extent Map也可以看到这个描述
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x01400088 ext#: 0 blk#: 8 ext size: 8 --高水位是第二个区的第一个块,插入只会插入高水位以下的块。并发插入时,高水位的位置会影响限制并发插入,因为只能插入高水位以下的块,对于8K的BLOCK大小:1M的区=128个块,那么超过128个并发会有热块,从而产生buffer busy waits; 如果是8M的区=1024个块,超过1024并发同样也会产生热块


#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset: 0
Unlocked
--------------------------------------------------------
Low HighWater Mark :  --低高水位,低高水位之下的数据都已经使用了
Highwater:: 0x01400088 ext#: 0 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset: 0
Level 1 BMB for High HWM block: 0x01400080
Level 1 BMB for Low HWM block: 0x01400080
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x01400081 --二级位图块的DBA
Last Level 1 BMB: 0x01400101
Last Level II BMB: 0x01400081
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 17 obj#: 77037 flag: 0x10000000
Inc # 0
Extent Map --segment有几个extent,extent的起始地址以及包含的块数
-----------------------------------------------------------------
0x01400080 length: 8
0x01400088 length: 8
0x01400090 length: 8
0x01400098 length: 8
0x014000a0 length: 8
0x014000a8 length: 8
0x014000b0 length: 8
0x014000b8 length: 8
0x014000c0 length: 8
0x014000c8 length: 8
0x014000d0 length: 8
0x014000d8 length: 8
0x014000e0 length: 8
0x014000e8 length: 8
0x014000f0 length: 8
0x014000f8 length: 8
0x01400100 length: 128

Auxillary Map --辅助map,extent由哪个L1管理及所管理的区,   和之前L1看到的信息对应

--------------------------------------------------------
Extent 0 : L1 dba: 0x01400080 Data dba: 0x01400083
Extent 1 : L1 dba: 0x01400080 Data dba: 0x01400088
Extent 2 : L1 dba: 0x01400090 Data dba: 0x01400091
Extent 3 : L1 dba: 0x01400090 Data dba: 0x01400098
Extent 4 : L1 dba: 0x014000a0 Data dba: 0x014000a1
Extent 5 : L1 dba: 0x014000a0 Data dba: 0x014000a8
Extent 6 : L1 dba: 0x014000b0 Data dba: 0x014000b1
Extent 7 : L1 dba: 0x014000b0 Data dba: 0x014000b8
Extent 8 : L1 dba: 0x014000c0 Data dba: 0x014000c1
Extent 9 : L1 dba: 0x014000c0 Data dba: 0x014000c8
Extent 10 : L1 dba: 0x014000d0 Data dba: 0x014000d1
Extent 11 : L1 dba: 0x014000d0 Data dba: 0x014000d8
Extent 12 : L1 dba: 0x014000e0 Data dba: 0x014000e1
Extent 13 : L1 dba: 0x014000e0 Data dba: 0x014000e8
Extent 14 : L1 dba: 0x014000f0 Data dba: 0x014000f1
Extent 15 : L1 dba: 0x014000f0 Data dba: 0x014000f8
Extent 16 : L1 dba: 0x01400100 Data dba: 0x01400102
--------------------------------------------------------

Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x01400081

End dump data blocks tsn: 6 file#: 5 minblk 130 maxblk 130

 

 ASSM三级位图块的结构可以用下图表示:

L1中有指向L3的指针,L2有指向L3的指针,L3中有多个数据块的指针和状态。
(1)每个L3中,有多个L2的地址(第一个L3是段头)。
(2)每个L2中,有多个L1的地址。
(3)每个L1中,有多个数据块地址。
ORACLE最多支持三级位图,Segment Heade可以管理极大数据量的对象的空间,很难出现另一个三级位图块。
一级位图用于管理具体数据块的使用,包括头部三个块,不仅仅指数据块的状态,标识的状态有Metadata、75-100% free、50-75% free、25-50% free、0-25% free、full、unformatted。
二级位图块记录了它管理的一级位图块(FIRST LEVEL BITMAP BLOCK)的地址。
三级位图块记录的内容比较多,除了记录了二级位图块(SECOND LEVEL BITMAP BLOCK)的地址。还记录了各个区的首块地址以及各个区的DB BLOCK的个数,段的各个区所对应的FIRST LEVEL BITMAP BLOCK的块地址以及区里面记录数据的数据块的起始地址。

如果一个区拥有很多块,这时会在一个区里出现两个或多个FIRST LEVEL BITMAP BLOCK,这些FIRST LEVEL BITMAP BLOCK分别管理一个区中的一些块,当区的数据块比较少时,一个区的FIRST LEVEL BITMAP BLOCK可以跨区管理多个区的数据块,BITMAP BOLCK最多为三级。

posted @ 2014-02-16 14:31  纳兹波蛋  阅读(2090)  评论(0编辑  收藏  举报