ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle ASSM 表空间

Oracle ASSM 表空间

原创 Linux操作系统 作者:roland_wg 时间:2008-08-14 13:28:36 0 删除 编辑

引用:

前几天Piner发布了一个悬赏:寻找ASSM三级位图块的文章,同时给出了对于ASSM结构的猜想。

Piner猜想的结构和我想像的不同,我认为ASSM的结构应该如下图所示:

也就是说我认为BMB的结构应该是均衡的,同时段头的PAGETABLE SEGMENT HEADER同时充当了第0个3级位图块的角色。

在PAGETABLE SEGMENT HEADER中实际上我们可以很容易的看到这样的输出:

--------------------------------------------------------
Segment Type: 1 nl2: 103 blksz: 2048 fbsz: 0
L2 Array start offset: 0x00000434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0355cfad
Last Level 1 BMB: 0x03560c9c
Last Level II BMB: 0x0355cfad
Last Level III BMB: 0x00000000
Map Header:: next 0x034000bf #extents: 51 obj#: 33141 flag: 0x20000000
Extent Map
-----------------------------------------------------------------


也就是说,这里记录了First Level 3 BMB和Last Level III BMB的地址,那么这就足够了,这里的双向指针完全可以进行Level 3级位图块的导航,而这第0个三级位图块也即段头,并无需记录所有3级位图块的地址。

由于产生另外一个3级位图块并不容易,所以Piner才提出悬赏,他构造了一个873G的大表,仍然没有产生另外的3级位图块:

SQL> select bytes/1024/1024/1024 "SIZE(G)" from user_segments where segment_name='TEST';

SIZE(G)
----------
873.25

为了寻找3级位图块,我着手做了以下实验,实验要能够:
1.实现更快快速的区间分配与扩展
2.使第0个3级位图块也即segment header尽量小,以便进一步扩展

为此我创建了一个2k block_size的表空间,设置uniform. size区间大小为10K,这样可以尽量所见空间耗用:

SQL> create tablespace eygle
2 datafile 'd:\EYGLE01.DBF' size 1024M reuse blocksize 2048
3 extent management local uniform. size 10k
4 segment space management auto;

表空间已创建。

SQL> set timing on
SQL> alter tablespace eygle add datafile 'f:\eygle02.dbf' size 8191M reuse;

表空间已更改。

已用时间: 00: 44: 42.08

注意,增加了一个8G的数据文件,足足用了我44分钟,这是一个Windows平台,异常缓慢。

然后创建一个数据表,设置高pctfree值,使得每个Block只存储一行数据,然后插入1千万记录:

SQL> create table EYGLE
2 (
3 ID NUMBER(8),
4 UNAME CHAR(1000)
5 )
6 tablespace eygle
7 pctfree 50
8 initrans 1
9 maxtrans 255
10 ;

表已创建。

已用时间: 00: 00: 00.00
SQL> begin
2 for i in 1 .. 100 loop
3 for i in 1 .. 100000 loop
4 insert into eygle values(i,'eygle');
5 end loop;
6 commit;
7 end loop;
8 end;
9 /

完成这些操作之后,这个表用了大约9G空间:

SQL> select bytes/1024/1024/1024 sizegb from dba_segments
2 where segment_name='EYGLE';

SIZEGB
----------
8.9988327

此时第一个3级位图块出现了,这是多么珍贵的一个3级位图块啊:

Start dump data blocks tsn: 12 file#: 13 minblk 4032222 maxblk 4032222
buffer tsn: 12 rdba: 0x037d86de (13/4032222)
scn: 0x0000.00bdc864 seq: 0x01 flg: 0x04 tail: 0xc8642201
frmt: 0x02 chkval: 0xf597 type: 0x22=THIRD LEVEL BITMAP BLOCK
Dump of Third Level Bitmap Block
number: 9 , next : 0x00000000
L2 Ranges :
--------------------------------------------------------
0x037d86dd
0x037dd22d 0x037e1d7d 0x037e68cd 0x037eb41d
0x037eff6d 0x037f4abd 0x037f960d 0x037fe15d

--------------------------------------------------------
End dump data blocks tsn: 12 file#: 13 minblk 4032222 maxblk 4032222

这个位图上上存在一个向下的指针:next : 0x00000000 ,当然现在还没有数值,我们可以再产生下一个3级位图块来观察。

那么实际上到这里已经足够了,我的图示已经得到了足够的说明。

引用:http://group.onezone.com/oracle/bbs/read_478_3431.html

Oracle ASSM 表空间


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

实际结构是如何的?

SQL> SELECT header_file,header_block FROM dba_segments WHERE segment_name = 'T1';                                                  

HEADER_FILE HEADER_BLOCK
----------- ------------
          4         4603
/*
先查到header block  file 4 block 4603/*

SQL> alter system dump datafile 4 block 4603;                                                                                      

System altered.

/*dump 出的结果/*

Start dump data blocks tsn: 4 file#: 4 minblk 4603 maxblk 4603
buffer tsn: 4 rdba: 0x010011fb (4/*4603)
scn: 0x0000.008f1069 seq: 0x01 fl g: 0x04 tail: 0x10692301
frmt: 0x02 chkval: 0x4c24 type: 0x23=PAGETABLE SEGMENT HEADER
Hex dump of block: st=0, typ_found=1

..............................

Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8    
                  last map  0x00000000  #maps: 0      offset: 2716 
      Highwater::  0x010011fd  ext#: 0      blk#: 4      ext size: 8    
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 4    
  mapblk  0x00000000  offset: 0    
                   Unlocked
  --------------------------------------------------------
  Low HighWater Mark :
      Highwater::  0x010011fd  ext#: 0      blk#: 4      ext size: 8    
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 4    
  mapblk  0x00000000  offset: 0    
  Level 1 BMB for High HWM block: 0x010011f9
  Level 1 BMB for Low HWM block: 0x010011f9
  --------------------------------------------------------
  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0     
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x010011fa
  Last Level 1 BMB:  0x010011f9
  Last Level II BMB:  0x010011fa
  Last Level III BMB:  0x00000000
     Map Header:: next  0x00000000  #extents: 1    obj#: 59172  flag: 0x10000000
  Inc # 0
  Extent Map
  -----------------------------------------------------------------
   0x010011f9  length: 8    
 
  Auxillary Map
  --------------------------------------------------------
   Extent 0     :  L1 dba:  0x010011f9 Data dba:  0x010011fc
  --------------------------------------------------------
 
   Second Level Bitmap block DBAs
   --------------------------------------------------------
   DBA 1:   0x010011fa

/*最后一行出现了 second level bitmap block的DBA /*

SQL> SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(to_number('010011fa','xxxxxxxx')) FROM dual;                                     

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('010011FA','XXXXXXXX'))
-----------------------------------------------------------------------
                                                                   4602

/*得到block number 4602/*

SQL> alter system dump datafile 4 block 4602;                                                                                      

System altered.

SQL>

/*dump 出的结果/*

Start dump data blocks tsn: 4 file#: 4 minblk 4602 maxblk 4602
buffer tsn: 4 rdba: 0x010011fa (4/*4602)
scn: 0x0000.008f1061 seq: 0x02 fl g: 0x04 tail: 0x10612102
frmt: 0x02 chkval: 0x7077 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:     0x010011fb
   Inc #: 0 Objd: 59172
  opcode:0
 xid:
  L1 Ranges :
  --------------------------------------------------------
   0x010011f9  Free: 5 Inst: 1

 
  --------------------------------------------------------
End dump data blocks tsn: 4 file#: 4 minblk 4602 maxblk 4602

/*first level bitmap block的DBA: 0x010011f9/*

SQL> SELECT DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(to_number('010011f9','xxxxxxxx')) FROM dual;                                     

DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('010011F9','XXXXXXXX'))
-----------------------------------------------------------------------
                                                                   4601

/*得到一级别位图快的block number/*

SQL> alter system dump datafile 4 block 4601;                                                                                      

System altered.


/*dump
的结果/*

Start dump data blocks tsn: 4 file#: 4 minblk 4601 maxblk 4601
buffer tsn: 4 rdba: 0x010011f9 (4/*4601)
scn: 0x0000.008f1065 seq: 0x02 fl g: 0x04 tail: 0x10652002
frmt: 0x02 chkval: 0x7093 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:  0x010011fa   poffset: 0    
   unformatted: 4       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 : 4     
   Bitmap block lock opcode 0
   Locker xid:     :  0x0000.000.00000000
   Inc #: 0 Objd: 59172
  HWM Flag: HWM Set
      Highwater::  0x010011fd  ext#: 0      blk#: 4      ext size: 8    
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 4    
  mapblk  0x00000000  offset: 0    
  --------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x010011f9  Length: 8      Offset: 0     
 
   0:Metadata   1:Metadata   2:Metadata   3:FULL
   4:unformatted   5:unformatted   6:unformatted   7:unformatted

  --------------------------------------------------------
End dump data blocks tsn: 4 file#: 4 minblk 4601 maxblk 4601

/**在这里metadata0是一级位图块 metadata1是二级位图块 metadata2是三级位图块

segment header block 4603在这里充当的是第0个三级位图块的角色,在此场景中它只管理了一个2级位图快 4602,4602也只管理了一个1级位图块 4602,4602中管理除了metadata外的数据块,有一个full的block 和几个unformatted的block.

那三级位图块有谁管理? segment header block?

我们在三级位图块的dump中看到如下内容:

 Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0     
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x010011fa
  Last Level 1 BMB:  0x010011f9
  Last Level II BMB:  0x010011fa
  Last Level III BMB:  0x00000000

这里记录了第一个三级位图块   First Level 3 BMB:  0x00000000

和最后一个三级位图块 Last Level III BMB:  0x00000000 显然 这是个空值因为此时并没有其他的三级位图块,但这已足够说明每个三级位图块提供了一个向上和向下的指针,segment header block不需要记录所有的三级位图块的地址.*/

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10513623/viewspace-426916/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: Oracle block的类型
请登录后发表评论 登录
全部评论

注册时间:2008-08-13

  • 博文量
    6
  • 访问量
    6430