ASSM内部存储研究大揭密

一、      ASSM的基本情况

 

在920以前,表的剩余空间的管理与分配都是由连接列表freelist来完成的,因为freelist存在串行的问题,因此容易引起往往容易引起段头的争用与空间的浪费(其实这一点并不明显),最主要的还是因为需要DBA花费大量的精力去管理这些争用并监控表的空间利用。

自动段空间管理(ASSM),它首次出现在Oracle920里。有了ASSM,连接列表freelist被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储本质,ASSM表空间上创建的段还有另外一个称呼叫Bitmap Managed Segments(BMB 段)。

让我们看看位图freelist是如何实现的。我会从使用区段空间管理自动参数创建tablespace开始:

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

Create tablespace demo

datafile '/ora01/oem/demo01.dbf '

size 5m

EXTENT MANAGEMENT LOCAL -- Turn on LMT

SEGMENT SPACE MANAGEMENT AUTO -- Turn on ASSM;

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

一旦你定义好了tablespace,那么表和索引就能够使用各种方法很容易地被移动到新的tablespace里,带有ASSM的本地管理tablespace会略掉任何为PCTUSED、NEXT和FREELISTS所指定的值。

当表格或者索引被分配到这个tablespace以后,用于独立对象的PCTUSED的值会被忽略,而Oracle9i会使用位图数组来自动地管理tablespace里表格和索引的freelist。对于在LMT的tablespace内部创建的表格和索引而言,这个NEXT扩展子句是过时的,因为由本地管理的tablespace会管理它们。但是,INITIAL参数仍然是需要的,因为Oracle不可能提前知道初始表格加载的大小。对于ASSM而言,INITIAL最小的值是三个块。

新的管理机制用位图来跟踪或管理每个分配到对象的块,每个块有多少剩余空间根据位图的状态来确定,如>75%,50%-75%,25%-50%和<25%,也就是说位图其实采用了四个状态位来代替以前的pctused,什么时候该利用该数据块则由设定的pctfree来确定。

使用ASSM的一个巨大优势是,位图freelist肯定能够减轻缓冲区忙等待(buffer busy wait)的负担,这个问题在Oracle9i以前的版本里曾是一个严重的问题。

在没有多个freelist的时候,每个Oracle表格和索引在表格的头部都曾有一个数据块,用来管理对象所使用的剩余区块,并为任何SQL插入声明所创建的新数据行提供数据块。当数据缓冲内的数据块由于被另一个DML事务处理锁定而无法使用的时候,缓冲区忙等待就会发生。当你需要将多个任务插入到同一个表格里的时候,这些任务就被强制等待,而同时Oracle会在同时分派剩余的区块,一次一个。

有了ASSM之后,Oracle宣称显著地提高了DML并发操作的性能,因为(同一个)位图的不同部分可以被同时使用,这样就消除了寻找剩余空间的串行化。根据Oracle的测试结果,使用位图freelist会消除所有分段头部(对资源)的争夺,还能获得超快的并发插入操作。

尽管ASSM显示出了令人激动的特性并能够简化Oracle DBA的工作,但是Oracle9i的位图分段管理还是有一些局限性的:

· 一旦DBA被分配之后,它就无法控制tablespace内部的独立表格和索引的存储行为。

· 你不能够使用ASSM创建临时的tablespace。这是由排序时临时分段的短暂特性所决定的。

· 只有本地管理的tablespace才能够使用位图分段管理。

· 使用超高容量的DML(例如INSERT、UPDATE和DELETE等)的时候可能会出现性能上的问题,但是在最新的版本上如9204以上,ASSM也开始了被广泛的应用。

 

 

<!--[if !supportLists]-->二、<!--[endif]-->ASSM到底是怎么回事,表是怎么结构的呢?

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

关键字:

ASSM,自动段管理

BMB Segment 位图段管理


1、我们先创建一个本地管理的表空间,采用段自动管理方式

Create tablespace demo

datafile '/ora01/oem/demo01.dbf '

size 50m

EXTENT MANAGEMENT LOCAL

SEGMENT SPACE MANAGEMENT AUTO;


2、创建同样一个表

 

SQL> create table demotab ( x number ) tablespace demo

storage (initial 1000K);

Table created

SQL> select t.table_name,t.initial_extent,t.next_extent,t.pct_free,t.pct_used from user_tables t where t.table_name = 'DEMOTAB';


TABLE_NAME INITIAL_EXTENT NEXT_EXTENT PCT_FREE PCT_USED

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

DEMOTAB 1024000 10

 

可以看到,NEXT_EXTENT与PCT_USED都为空。

 

3、执行该过程,检查表的初始状态

SQL> exec show_space('demotab');

Total Blocks............................128

Total Bytes.............................1048576

Unused Blocks...........................125

Unused Bytes............................1024000

Last Used Ext FileId....................7

Last Used Ext BlockId...................8

Last Used Block.........................3

从这里我们能看到一些该表的特性,其中最引人注意的就是表头了,占用了三个块的大小。

另外一个注意的地方就是该表从第8个块开始,但是实际上这里是错误的,应当是从第9个块开始,文件头占用了64K的空间等于8个块。

我们从dba_extent中也能看到这样的信息,实际上是从第9个块开始的。

SQL> select t.segment_name,t.extent_id,t.block_id from dba_extents t where t.segment_name = 'DEMOTAB';


SEGMENT_NAME EXTENT_ID BLOCK_ID

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

DEMOTAB 0 9

DEMOTAB 1 17

……

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

4、我直接开始分析第9,10,11个块(段头)

SQL> alter system dump datafile 7 block 9;

System altered

SQL> alter system dump datafile 7 block 10;

System altered

SQL> alter system dump datafile 7 block 11;

System altered


Start dump data blocks tsn: 6 file#: 7 minblk 9 maxblk 9

buffer tsn: 6 rdba: 0x06800009 (7/9)

scn: 0x0000.00181a2c seq: 0x01 flg: 0x04 tail: 0x1a2c2001

frmt: 0x02 chkval: 0x30a6 type: 0x20=FIRST LEVEL BITMAP BLOCK

Dump of First Level Bitmap Block

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

nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 0 

unformatted: 13 total: 16 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

Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8 

#blocks in seg. hdr's freelists: 0 

#blocks below: 0 

mapblk 0x00000000 offset: 0 

HWM Flag: HWM Set

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

DBA Ranges :

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

0x06800009 Length: 8 Offset: 0 

0x06800011 Length: 8 Offset: 8 


0:Metadata 1:Metadata 2:Metadata 3:unformatted

4:unformatted 5:unformatted 6:unformatted 7:unformatted

8:unformatted 9:unformatted 10:unformatted 11:unformatted

12:unformatted 13:unformatted 14:unformatted 15:unformatted

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

End dump data blocks tsn: 6 file#: 7 minblk 9 maxblk 9


Start dump data blocks tsn: 6 file#: 7 minblk 10 maxblk 10

buffer tsn: 6 rdba: 0x0680000a (7/10)

scn: 0x0000.00181a39 seq: 0x01 flg: 0x04 tail: 0x1a392101

frmt: 0x02 chkval: 0x2738 type: 0x21=SECOND LEVEL BITMAP BLOCK

Dump of Second Level Bitmap Block

number: 8 nfree: 8 ffree: 0 pdba: 0x0680000b 

opcode:0 

xid: 

L1 Ranges :

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

0x06800009 Free: 5 Inst: 1 

0x06800019 Free: 5 Inst: 1 

0x06800029 Free: 5 Inst: 1 

0x06800039 Free: 5 Inst: 1 

0x06800049 Free: 5 Inst: 1 

0x06800059 Free: 5 Inst: 1 

0x06800069 Free: 5 Inst: 1 

0x06800079 Free: 5 Inst: 1 


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

End dump data blocks tsn: 6 file#: 7 minblk 10 maxblk 10


Start dump data blocks tsn: 6 file#: 7 minblk 11 maxblk 11

buffer tsn: 6 rdba: 0x0680000b (7/11)

scn: 0x0000.00181a3d seq: 0x01 flg: 0x04 tail: 0x1a3d2301

frmt: 0x02 chkval: 0x4904 type: 0x23=PAGETABLE SEGMENT HEADER

Extent Control Header

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

Extent Header:: spare1: 0 spare2: 0 #extents: 16 #blocks: 128 

last map 0x00000000 #maps: 0 offset: 2716 

Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8 

#blocks in seg. hdr's freelists: 0 

#blocks below: 0 

mapblk 0x00000000 offset: 0 

Unlocked

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

Low HighWater Mark : 

Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8 

#blocks in seg. hdr's freelists: 0 

#blocks below: 0 

mapblk 0x00000000 offset: 0 

Level 1 BMB for High HWM block: 0x06800009

Level 1 BMB for Low HWM block: 0x06800009

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

Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0 

L2 Array start offset: 0x00001434

First Level 3 BMB: 0x00000000

L2 Hint for inserts: 0x0680000a

Last Level 1 BMB: 0x06800079

Last Level II BMB: 0x0680000a

Last Level III BMB: 0x00000000

Map Header:: next 0x00000000 #extents: 16 obj#: 29929 flag: 0x20000000

Extent Map

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

0x06800009 length: 8 

0x06800011 length: 8 

0x06800019 length: 8 

0x06800021 length: 8 

0x06800029 length: 8 

0x06800031 length: 8 

0x06800039 length: 8 

0x06800041 length: 8 

0x06800049 length: 8 

0x06800051 length: 8 

0x06800059 length: 8 

0x06800061 length: 8 

0x06800069 length: 8 

0x06800071 length: 8 

0x06800079 length: 8 

0x06800081 length: 8 


Auxillary Map

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

Extent 0 : L1 dba: 0x06800009 Data dba: 0x0680000c

Extent 1 : L1 dba: 0x06800009 Data dba: 0x06800011

Extent 2 : L1 dba: 0x06800019 Data dba: 0x0680001a

Extent 3 : L1 dba: 0x06800019 Data dba: 0x06800021

Extent 4 : L1 dba: 0x06800029 Data dba: 0x0680002a

Extent 5 : L1 dba: 0x06800029 Data dba: 0x06800031

Extent 6 : L1 dba: 0x06800039 Data dba: 0x0680003a

Extent 7 : L1 dba: 0x06800039 Data dba: 0x06800041

Extent 8 : L1 dba: 0x06800049 Data dba: 0x0680004a

Extent 9 : L1 dba: 0x06800049 Data dba: 0x06800051

Extent 10 : L1 dba: 0x06800059 Data dba: 0x0680005a

Extent 11 : L1 dba: 0x06800059 Data dba: 0x06800061

Extent 12 : L1 dba: 0x06800069 Data dba: 0x0680006a

Extent 13 : L1 dba: 0x06800069 Data dba: 0x06800071

Extent 14 : L1 dba: 0x06800079 Data dba: 0x0680007a

Extent 15 : L1 dba: 0x06800079 Data dba: 0x06800081

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


Second Level Bitmap block DBAs 

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

DBA 1: 0x0680000a


End dump data blocks tsn: 6 file#: 7 minblk 11 maxblk 11

 

从这里,我们能获得什么信息?这个是很重要的。

分析块9,这个块叫FIRST LEVEL BITMAP BLOCK。我们可以看到,这里保留了16个块的信息(注意,不是16个区间的信息),它记录的是块的空间使用信息,开始16个块中间有3个块是Metadata类型(块9,10,11),这部分块就是以下将要说明的位图块与段头块,因为不能存放数据,所以标记为Metadata类型。除此之外,其它的都是未使用的数据块类型为unformatted,有13个。

问题?为什么这里只保留16个块的信息呢?这需要我们进一步研究(往下看)。

分析块10,叫SECOND LEVEL BITMAP BLOCK。这个就比较有意思了,记录了可能出现的类似于块9的块出现的地址(DBA)。刚才在上面不是说了吗,块9只能记录16个块的信息,那16个块之后的信息怎么办?BMB段采用了分布的策略,在第25个块的地方,oracle将增加一个新的块用来记录下16个块(等会儿看测试),那么块10记录的就是这些块的地址了,如:

0x06800019 Free: 5 Inst: 1 代表下一个块的地址是19(十六进制),其实是就是十进制的25。那么我们想象,再下一个是25+16=41。应当是十六进制的29,再查看块10的内容,大家可以知道这个块的作用了吧。

再看块11,是该表的段头,这里记录了表的区间地图,包括表段的16个区间的分布地址,如果没有创建表,是没有该块的,这个块与ASSM位图块本身没有多大关系,在每个段的头部都会有一个,因为这个是该表空间的第一个段,所以位置放在了块11。

可以看到其实在ASSM的表里面,取消了原来的freelist,其实增加了很多块来管理块的数据,这些块不再分布在块的头部,而是分布在表的内部,每隔16个块(这个数目与不同的环境可能有差别),就有一个块来记录下16个块的数据保留的情况。

位图数据的级别可以分为三个级别,当存在一个或多个一级位图块(如块9,19)的时候,将由二级位图(如块10)块来保存一级位图块的地址,同理,一个二级位图块不够使用而出现多个二级位图块的时候,将由三级位图块来保存二级位图块的地址(类似索引结构,由于三级位图块的出现需要很多数据块,所以这里不讨论三级位图块)。整个位图数组的结构形成一个树状结构,有利于ORACLE跟踪所有的位图数据块的位置。

附图:

 

<!--[if !vml]--><!--[endif]-->

 

<!--[if !supportLists]-->三、           <!--[endif]-->我们开始插入数据,进一步说明情况。

 

SQL>insert into demotab

select rownum from dba_objects;

28985 rows inserted;


然后我们运行

SQL> exec show_space('demotab');

Total Blocks............................128

Total Bytes.............................1048576

Unused Blocks...........................72

Unused Bytes............................589824

Last Used Ext FileId....................26

Last Used Ext BlockId...................56

Last Used Block.........................8


这里有一个新的过程,用于专门分析自动段管理的段中的块的组成

declare 

v_unformatted_blocks number; 

v_unformatted_bytes number; 

v_fs1_blocks number; 

v_fs1_bytes number; 

v_fs2_blocks number; 

v_fs2_bytes number; 

v_fs3_blocks number; 

v_fs3_bytes number; 

v_fs4_blocks number; 

v_fs4_bytes number; 

v_full_blocks number; 

v_full_bytes number; 

begin 

dbms_space.space_usage ('SYS', 'DEMOTAB', 'TABLE', v_unformatted_blocks, 

v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks, v_fs2_bytes, 

v_fs3_blocks, v_fs3_bytes, v_fs4_blocks, v_fs4_bytes, v_full_blocks, v_full_bytes); 

dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks); 

dbms_output.put_line('FS1 Blocks = '||v_fs1_blocks); 

dbms_output.put_line('FS2 Blocks = '||v_fs2_blocks); 

dbms_output.put_line('FS3 Blocks = '||v_fs3_blocks); 

dbms_output.put_line('FS4 Blocks = '||v_fs4_blocks); 

dbms_output.put_line('Full Blocks = '||v_full_blocks); 

end;/


Unformatted Blocks = 0

FS1 Blocks = 1

FS2 Blocks = 0

FS3 Blocks = 0

FS4 Blocks = 6

Full Blocks = 43

PL/SQL procedure successfully completed

在这里

FS1表示0-25%空闲空间的块

FS2表示25-50%空闲空间的块

FS3表示50-75%空闲空间的块

FS4表示 75-100%空闲空间的块


这里我们能看到什么呢?

可以看到的是,

Total Blocks............................128

Unused Blocks...........................72

就是说,我们这次插入用了56个块。

但是看下面的数据,也就是数据块只有1+6+43=50个,还有6个的差别在哪里呢?我们已知的就是段头有3个,那还有3个应当就是分布在表中的位图块了(假定)。我们进一步分析。

用了56个块,其实就是7个区间,7个区间,每个位图块只能管理16个块(2个区间),这里应当用到了4个位图块才能够管理过来,4个中有一个属于段头的3个,那正好是50+3+3=56了。我们进一步分析。

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

再看那段头变成什么样了?

Start dump data blocks tsn: 6 file#: 7 minblk 9 maxblk 9

buffer tsn: 6 rdba: 0x06800009 (7/9)

scn: 0x0000.0018b7ca seq: 0x2d flg: 0x00 tail: 0xb7ca202d

frmt: 0x02 chkval: 0x0000 type: 0x20=FIRST LEVEL BITMAP BLOCK

Dump of First Level Bitmap Block

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

nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 0 

unformatted: 0 total: 16 first useful block: 3 

owning instance : 1

instance ownership changed at 08/19/2003 10:41:42

Last successful Search 08/19/2003 10:41:42

Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0 


Extent Map Block Offset: 4294967295 

First free datablock : 16 

Bitmap block lock opcode 0

Locker xid: : 0x0000.000.00000000

Highwater:: 0x00000000 ext#: 0 blk#: 0 ext size: 0 

#blocks in seg. hdr's freelists: 0 

#blocks below: 0 

mapblk 0x00000000 offset: 0 

HWM Flag: Not Set

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

DBA Ranges :

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

0x06800009 Length: 8 Offset: 0 

0x06800011 Length: 8 Offset: 8 


0:Metadata 1:Metadata 2:Metadata 3:FULL

4:FULL 5:FULL 6:FULL 7:FULL

8:FULL 9:FULL 10:FULL 11:FULL

12:FULL 13:FULL 14:FULL 15:FULL

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

End dump data blocks tsn: 6 file#: 7 minblk 9 maxblk 9


Start dump data blocks tsn: 6 file#: 7 minblk 10 maxblk 10

buffer tsn: 6 rdba: 0x0680000a (7/10)

scn: 0x0000.0018b7cb seq: 0x07 flg: 0x00 tail: 0xb7cb2107

frmt: 0x02 chkval: 0x0000 type: 0x21=SECOND LEVEL BITMAP BLOCK

Dump of Second Level Bitmap Block

number: 8 nfree: 5 ffree: 3 pdba: 0x0680000b 

opcode:0 

xid: 

L1 Ranges :

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

0x06800009 Free: 1 Inst: 1 

0x06800019 Free: 1 Inst: 1 

0x06800029 Free: 1 Inst: 1 

0x06800039 Free: 5 Inst: 1 

0x06800049 Free: 5 Inst: 1 

0x06800059 Free: 5 Inst: 1 

0x06800069 Free: 5 Inst: 1 

0x06800079 Free: 5 Inst: 1 


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

End dump data blocks tsn: 6 file#: 7 minblk 10 maxblk 10


Start dump data blocks tsn: 6 file#: 7 minblk 11 maxblk 11

buffer tsn: 6 rdba: 0x0680000b (7/11)

scn: 0x0000.0018b7cb seq: 0x03 flg: 0x00 tail: 0xb7cb2303

frmt: 0x02 chkval: 0x0000 type: 0x23=PAGETABLE SEGMENT HEADER

Extent Control Header

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

Extent Header:: spare1: 0 spare2: 0 #extents: 16 #blocks: 128 

last map 0x00000000 #maps: 0 offset: 2716 

Highwater:: 0x06800041 ext#: 6 blk#: 8 ext size: 8 

#blocks in seg. hdr's freelists: 0 

#blocks below: 50 

mapblk 0x00000000 offset: 6 

Unlocked

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

Low HighWater Mark : 

Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8 

#blocks in seg. hdr's freelists: 0 

#blocks below: 0 

mapblk 0x00000000 offset: 0 

Level 1 BMB for High HWM block: 0x06800039

Level 1 BMB for Low HWM block: 0x06800009

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

Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0 

L2 Array start offset: 0x00001434

First Level 3 BMB: 0x00000000

L2 Hint for inserts: 0x0680000a

Last Level 1 BMB: 0x06800079

Last Level II BMB: 0x0680000a

Last Level III BMB: 0x00000000

Map Header:: next 0x00000000 #extents: 16 obj#: 29929 flag: 0x20000000

Extent Map

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

0x06800009 length: 8 

0x06800011 length: 8 

0x06800019 length: 8 

0x06800021 length: 8 

0x06800029 length: 8 

0x06800031 length: 8 

0x06800039 length: 8 

0x06800041 length: 8 

0x06800049 length: 8 

0x06800051 length: 8 

0x06800059 length: 8 

0x06800061 length: 8 

0x06800069 length: 8 

0x06800071 length: 8 

0x06800079 length: 8 

0x06800081 length: 8 


Auxillary Map

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

Extent 0 : L1 dba: 0x06800009 Data dba: 0x0680000c

Extent 1 : L1 dba: 0x06800009 Data dba: 0x06800011

Extent 2 : L1 dba: 0x06800019 Data dba: 0x0680001a

Extent 3 : L1 dba: 0x06800019 Data dba: 0x06800021

Extent 4 : L1 dba: 0x06800029 Data dba: 0x0680002a

Extent 5 : L1 dba: 0x06800029 Data dba: 0x06800031

Extent 6 : L1 dba: 0x06800039 Data dba: 0x0680003a

Extent 7 : L1 dba: 0x06800039 Data dba: 0x06800041

Extent 8 : L1 dba: 0x06800049 Data dba: 0x0680004a

Extent 9 : L1 dba: 0x06800049 Data dba: 0x06800051

Extent 10 : L1 dba: 0x06800059 Data dba: 0x0680005a

Extent 11 : L1 dba: 0x06800059 Data dba: 0x06800061

Extent 12 : L1 dba: 0x06800069 Data dba: 0x0680006a

Extent 13 : L1 dba: 0x06800069 Data dba: 0x06800071

Extent 14 : L1 dba: 0x06800079 Data dba: 0x0680007a

Extent 15 : L1 dba: 0x06800079 Data dba: 0x06800081

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


Second Level Bitmap block DBAs 

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

DBA 1: 0x0680000a


End dump data blocks tsn: 6 file#: 7 minblk 11 maxblk 11

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

看块9,可以看到,段头的三个块没有动。另外的13个块都是FULL(100%充满)状态。

看块10,可以看到,充分利用的位图块的位置是:

0x06800009 Free: 1 Inst: 1 --对应9

0x06800019 Free: 1 Inst: 1 --对应25

0x06800029 Free: 1 Inst: 1 --对应41

应当还有一个不完全利用的

0x06800039 Free: 5 Inst: 1 --对应57

下面我们证实一下


块25的信息:

Start dump data blocks tsn: 6 file#: 7 minblk 25 maxblk 25

buffer tsn: 6 rdba: 0x06800019 (7/25)

scn: 0x0000.0018b7cb seq: 0x0e flg: 0x04 tail: 0xb7cb200e

frmt: 0x02 chkval: 0x261c type: 0x20=FIRST LEVEL BITMAP BLOCK

Dump of First Level Bitmap Block

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

nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 1 

unformatted: 0 total: 16 first useful block: 1 

owning instance : 1

instance ownership changed at 08/19/2003 10:41:42

Last successful Search 08/19/2003 10:41:42

Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0 


Extent Map Block Offset: 4294967295 

First free datablock : 16 

Bitmap block lock opcode 0

Locker xid: : 0x0000.000.00000000

Highwater:: 0x00000000 ext#: 0 blk#: 0 ext size: 0 

#blocks in seg. hdr's freelists: 0 

#blocks below: 0 

mapblk 0x00000000 offset: 0 

HWM Flag: Not Set

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

DBA Ranges :

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

0x06800019 Length: 8 Offset: 0 

0x06800021 Length: 8 Offset: 8 


0:Metadata 1:FULL 2:FULL 3:FULL

4:FULL 5:FULL 6:FULL 7:FULL

8:FULL 9:FULL 10:FULL 11:FULL

12:FULL 13:FULL 14:FULL 15:FULL

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

End dump data blocks tsn: 6 file#: 7 minblk 25 maxblk 25


块41的信息

Start dump data blocks tsn: 6 file#: 7 minblk 41 maxblk 41

buffer tsn: 6 rdba: 0x06800029 (7/41)

scn: 0x0000.0018b7cb seq: 0x35 flg: 0x04 tail: 0xb7cb2035

frmt: 0x02 chkval: 0x260f type: 0x20=FIRST LEVEL BITMAP BLOCK

Dump of First Level Bitmap Block

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

nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 2 

unformatted: 0 total: 16 first useful block: 1 

owning instance : 1

instance ownership changed at 08/19/2003 10:41:42

Last successful Search 08/19/2003 10:41:42

Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0 


Extent Map Block Offset: 4294967295 

First free datablock : 16 

Bitmap block lock opcode 0

Locker xid: : 0x0000.000.00000000

Highwater:: 0x00000000 ext#: 0 blk#: 0 ext size: 0 

#blocks in seg. hdr's freelists: 0 

#blocks below: 0 

mapblk 0x00000000 offset: 0 

HWM Flag: Not Set

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

DBA Ranges :

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

0x06800029 Length: 8 Offset: 0 

0x06800031 Length: 8 Offset: 8 


0:Metadata 1:FULL 2:FULL 3:FULL

4:FULL 5:FULL 6:FULL 7:FULL

8:FULL 9:FULL 10:FULL 11:FULL

12:FULL 13:FULL 14:FULL 15:FULL

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

End dump data blocks tsn: 6 file#: 7 minblk 41 maxblk 41


块57的信息

Start dump data blocks tsn: 6 file#: 7 minblk 57 maxblk 57

buffer tsn: 6 rdba: 0x06800039 (7/57)

scn: 0x0000.0018b7cb seq: 0x04 flg: 0x04 tail: 0xb7cb2004

frmt: 0x02 chkval: 0x27d2 type: 0x20=FIRST LEVEL BITMAP BLOCK

Dump of First Level Bitmap Block

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

nbits : 4 nranges: 2 parent dba: 0x0680000a poffset: 3 

unformatted: 8 total: 16 first useful block: 1 

owning instance : 1

instance ownership changed at 08/19/2003 10:41:42

Last successful Search 08/19/2003 10:41:42

Freeness Status: nf1 1 nf2 0 nf3 0 nf4 6 


Extent Map Block Offset: 4294967295 

First free datablock : 1 

Bitmap block lock opcode 0

Locker xid: : 0x0000.000.00000000

Highwater:: 0x06800041 ext#: 6 blk#: 8 ext size: 8 

#blocks in seg. hdr's freelists: 0 

#blocks below: 50 

mapblk 0x00000000 offset: 6 

HWM Flag: HWM Set

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

DBA Ranges :

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

0x06800039 Length: 8 Offset: 0 

0x06800041 Length: 8 Offset: 8 


0:Metadata 1:75-100% free 2:75-100% free 3:75-100% free

4:75-100% free 5:75-100% free 6:75-100% free 7:0-25% free

8:unformatted 9:unformatted 10:unformatted 11:unformatted

12:unformatted 13:unformatted 14:unformatted 15:unformatted

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

End dump data blocks tsn: 6 file#: 7 minblk 57 maxblk 57

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

块9:2个段头+1个位图+13个FULL

块25:1个位图+15个FULL

块41:1个位图+15个FULL

块57:1个位图+6个75-100% free+1个0-25% free


大家可以看到正好满足上面的:

FS1 Blocks = 1

FS2 Blocks = 0

FS3 Blocks = 0

FS4 Blocks = 6

Full Blocks = 43


到这里,大家也明白了

3*16+8=56了

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

最后,我们讨论高水点的确定。

到这里,大家该知道高水点的位置是多少了吧,应该是56+8(文件头)+1=65。但是看我们的块11,怎么解释这个呢?

Highwater:: 0x06800041 ext#: 6 blk#: 8 ext size: 8 

#blocks in seg. hdr's freelists: 0 

#blocks below: 50 

mapblk 0x00000000 offset: 6 

Unlocked

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

Low HighWater Mark : 

Highwater:: 0x0680000c ext#: 0 blk#: 3 ext size: 8 

<!--[if !supportLineBreakNewLine]-->

<!--[endif]-->

其中有两个Highwater,第一个记录了真正的高水点,H41,就是十进制65。第二个表示底的高水点,从哪里开始,很明显,从12(十六进制的c)个块开始(前面是8个文件头+3个段头)。其实,我们从最后一个位图块(57)的dump中也可以看到这样的信息

Locker xid: : 0x0000.000.00000000

Highwater:: 0x06800041 ext#: 6 blk#: 8 ext size: 8

 

到这里,该明白ASSM表的组成与结构了吧。大家有兴趣,可以继续研究插入与删除的情况,按照这个方法,应当就很简单了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值