暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

段空间管理技术-自动段空间管理

原创 eygle 2019-10-14
1208

在Oracle 9i中,Oracle引入了自动段空间管理(ASSM)技术,在ASSM中,原有的freelist被位图所取代,通过位图能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善段存储管理的本质。


在ASSM管理下,insert通过扫描位图来查找可用的block,即使block的可用空间低于PCTFREE,也不会从位图中摘除,因此PCTUSED参数将不再需要;而PCTFREE参数,仍然需要它来指示需要保留多少空间给后续的update导致的行数据增长使用。至于freelists和freelist groups参数在ASSM中都无效了。


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


使用ASSM的一个巨大优势是,位图数组肯定能够减轻缓冲区忙等待(buffer busy wait)的负担,这个问题在Oracle 9i以前的版本里曾经是一个严重的问题。在没有多个自由列表的时候,每个Oracle段通过在段头保留一个数据块用于自由列表(假定只有一个freelist),自由列表用来管理对象所使用的剩余区块,并为新数据行提供数据块。可以想象,当多个事务并发请求空间时,竞争将会出现。


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


删除前面创建的测试表空间:

SQL> drop tablespace eygle including contents and datafiles;
Tablespace dropped.


重新创建一个ASSM管理的表空间:

SQL> CREATE TABLESPACE eygle
  2  DATAFILE '/opt/oracle/oradata/eygle/eygle01.dbf' SIZE 10M
  3  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128k
  4  SEGMENT SPACE MANAGEMENT AUTO;
Tablespace created.
SQL> SELECT tablespace_name, extent_management, allocation_type,segment_space_management
  2    FROM dba_tablespaces WHERE tablespace_name = 'EYGLE';
TABLESPACE_NAME                EXTENT_MAN ALLOCATIO SEGMEN
------------------------------ ---------- --------- ------
EYGLE                          LOCAL      UNIFORM   AUTO


然后创建一个对象:

SQL> create table eygle.test as select * from dba_objects;
Table created.
SQL> col segment_name for a30
SQL> select segment_name,file_id,block_id,to_char(block_id,'xx') hex_block_id,blocks
  2  from dba_extents where tablespace_name='EYGLE';
SEGMENT_NAME    FILE_ID   BLOCK_ID HEX     BLOCKS
------------ ---------- ---------- --- ----------
TEST                  3          9   9         16
TEST                  3         25  19         16
TEST                  3         41  29         16
TEST                  3         57  39         16
TEST                  3         73  49         16
TEST                  3         89  59         16
6 rows selected.


通过图5-4来看一下ASSM的管理机制,首先前2个数据块为数据文件头,3~8个数据块为区位图块,接下来的第9个块和第10个块就是ASSM位图块。


image.png


一级位图块用于管理具体数据块的使用,来看一下第9个Block的内容:

SQL> alter system dump datafile 3 block 9;
System altered.


转储文件内容为:

Start dump data blocks tsn: 4 file#: 3 minblk 9 maxblk 9
buffer tsn: 4 rdba: 0x00c00009 (3/9)
scn: 0x0004.6c1e9ab0 seq: 0x03 flg: 0x00 tail: 0x9ab02003
frmt: 0x02 chkval: 0x0000 type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
 --------------------------------
   nbits : 4 nranges: 1         parent dba:  0x00c0000a   poffset: 0    
   unformatted: 0       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 : 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 :
  --------------------------------------------------------
   0x00c00009  Length: 16     Offset: 0     
 
   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: 4 file#: 3 minblk 9 maxblk 9


注意到这个位图管理了16个Block,地址范围从0x00c00009开始(也就是第9个数据块),其中前3个Block(0~2)用于存储元数据,其余用来存储数据,FULL状态表示块已经用完。这就是第一级位图块(FIRST LEVEL BITMAP BLOCK)。


由于这个位图块只能管理16个Block,如果这个对象的空间超过这个值,那么Oracle就要分配更多的第一级位图块来管理Block,进而这些一级位图块又需要管理,于是又引出了二级位图块,Oracle最多支持三级位图块。


注意这个Block上还记录了另外一个信息“parent dba:  0x00c0000a”,这里也就是指二级位图块的地址,0a就是第10个Block,转储一下第10个Block的内容:

Start dump data blocks tsn: 4 file#: 3 minblk 10 maxblk 10
buffer tsn: 4 rdba: 0x00c0000a (3/10)
scn: 0x0004.6c1e9ab0 seq: 0x06 flg: 0x00 tail: 0x9ab02106
frmt: 0x02 chkval: 0x0000 type: 0x21=SECOND LEVEL BITMAP BLOCK
Dump of Second Level Bitmap Block
   number: 6       nfree: 1       ffree: 5      pdba:     0x00c0000b
  opcode:0
 xid:
  L1 Ranges :
  --------------------------------------------------------
   0x00c00009  Free: 1 Inst: 1
   0x00c00019  Free: 1 Inst: 1
   0x00c00029  Free: 1 Inst: 1
   0x00c00039  Free: 1 Inst: 1
   0x00c00049  Free: 1 Inst: 1
   0x00c00059  Free: 5 Inst: 1
 
  --------------------------------------------------------
End dump data blocks tsn: 4 file#: 3 minblk 10 maxblk 10


注意这个二级位图块(SECOND LEVEL BITMAP BLOCK)正是记录了一级位图块的地址,L1 Ranges代表的就是这个内容,也正是每个区间的第一个Block,在这个块内同样包含了一个上级位图块地址,在这里是是pdba: 0x00c0000b,也就是块11。


为了方便rdba向文件号和数据块号的转换,可以创建如下函数:

SQL> CREATE OR REPLACE FUNCTION getbfno (p_dba IN VARCHAR2)
  2     RETURN VARCHAR2
  3  IS
  4     l_str   VARCHAR2 (255) DEFAULT NULL;
  5  BEGIN
  6     l_str :=
  7           'datafile# is:'
  8        || DBMS_UTILITY.data_block_address_file (TO_NUMBER (LTRIM (p_dba, '0x'),'xxxxxxxx'))
  9        || chr(10)||'datablock is:'
 10        || DBMS_UTILITY.data_block_address_block (TO_NUMBER (LTRIM (p_dba, '0x'),'xxxxxxxx'));
 11     RETURN l_str;
 12  END;
 13  /
 
Function created.


现在转换0x00c0000b就更直观了:

SQL> col bfno for a30
SQL> select getbfno('0x00c0000b') bfno from dual;
BFNO
------------------------------
datafile# is:3
datablock is:11


转储文件3块11信息,这个数据块正是数据段的段头信息,段头中记录了哪些位图块管理单元被包含在对象中:

Start dump data blocks tsn: 4 file#: 3 minblk 11 maxblk 11
buffer tsn: 4 rdba: 0x00c0000b (3/11)
scn: 0x0004.6c1e9ab7 seq: 0x01 flg: 0x04 tail: 0x9ab72301
frmt: 0x02 chkval: 0x718b type: 0x23=PAGETABLE SEGMENT HEADER
  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 6      #blocks: 96   
                  last map  0x00000000  #maps: 0      offset: 2716 
      Highwater::  0x00c0005d  ext#: 5      blk#: 4      ext size: 16   
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 84   
  mapblk  0x00000000  offset: 5    
                   Unlocked
  --------------------------------------------------------
  Low HighWater Mark :
      Highwater::  0x00c0005d  ext#: 5      blk#: 4      ext size: 16   
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 84   
  mapblk  0x00000000  offset: 5    
  Level 1 BMB for High HWM block: 0x00c00059
  Level 1 BMB for Low HWM block: 0x00c00059
  --------------------------------------------------------
  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0     
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x00c0000a
  Last Level 1 BMB:  0x00c00059
  Last Level II BMB:  0x00c0000a
  Last Level III BMB:  0x00000000
     Map Header:: next  0x00000000  #extents: 6    obj#: 9972   flag: 0x20000000
  Extent Map
  -----------------------------------------------------------------
   0x00c00009  length: 16   
   0x00c00019  length: 16   
   0x00c00029  length: 16   
   0x00c00039  length: 16   
   0x00c00049  length: 16   
   0x00c00059  length: 16   
 
  Auxillary Map
  --------------------------------------------------------
   Extent 0     :  L1 dba:  0x00c00009 Data dba:  0x00c0000c
   Extent 1     :  L1 dba:  0x00c00019 Data dba:  0x00c0001a
   Extent 2     :  L1 dba:  0x00c00029 Data dba:  0x00c0002a
   Extent 3     :  L1 dba:  0x00c00039 Data dba:  0x00c0003a
   Extent 4     :  L1 dba:  0x00c00049 Data dba:  0x00c0004a
   Extent 5     :  L1 dba:  0x00c00059 Data dba:  0x00c0005a
  --------------------------------------------------------
 
   Second Level Bitmap block DBAs
   --------------------------------------------------------
   DBA 1:   0x00c0000a
 
End dump data blocks tsn: 4 file#: 3 minblk 11 maxblk 11


注意段头的数据块类型是Oracle 9i中新增的“type: 0x23=PAGETABLE SEGMENT HEADER”,在段头的最后部分记录了二级位图块的地址:

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


所以通常SEGMENT HEADER也被看作是第一个Level 3级的位图块,如果SEGMENT HEADER的空间不足以存储二级位图块的指针,那么新的Level 3级位图块将被创建。


也可以DUMP一下第89个位图块:

SQL> alter system dump datafile 3 block 89;
System altered.


其内容就包括了未使用(unformatted)的数据块,其二级位图块同样指向了0x00c0000a:

Start dump data blocks tsn: 4 file#: 3 minblk 89 maxblk 89
buffer tsn: 4 rdba: 0x00c00059 (3/89)
scn: 0x0004.6c1e9ab0 seq: 0x02 flg: 0x04 tail: 0x9ab02002
frmt: 0x02 chkval: 0x5b35 type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
 --------------------------------
   nbits : 4 nranges: 1         parent dba:  0x00c0000a   poffset: 5    
   unformatted: 12      total: 16        first useful block: 1     
   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
      Highwater::  0x00c0005d  ext#: 5      blk#: 4      ext size: 16   
  #blocks in seg. hdr's freelists: 0    
  #blocks below: 84   
  mapblk  0x00000000  offset: 5    
  HWM Flag: HWM Set
  --------------------------------------------------------
  DBA  Ranges :
  --------------------------------------------------------
   0x00c00059  Length: 16     Offset: 0     
 
   0:Metadata   1:FULL   2:FULL   3:FULL
   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: 4 file#: 3 minblk 89 maxblk 89


如果删除部分数据,就可以看到空间记录的变化:

SQL> delete from eygle.test where owner='SYS';
4030 rows deleted.
 
SQL> commit;
Commit complete.
 
SQL> select count(*) from eygle.test;
  COUNT(*)
----------
      2143


再看块9的内容:

Start dump data blocks tsn: 4 file#: 3 minblk 9 maxblk 9
buffer tsn: 4 rdba: 0x00c00009 (3/9)
scn: 0x0004.6c1ea433 seq: 0x03 flg: 0x04 tail: 0xa4332003
frmt: 0x02 chkval: 0x0abd type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
 --------------------------------
   nbits : 4 nranges: 1         parent dba:  0x00c0000a   poffset: 0    
   unformatted: 0       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 13    
 
   Extent Map Block Offset: 4294967295
   First free datablock : 3     
   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 :
  --------------------------------------------------------
   0x00c00009  Length: 16     Offset: 0     
 
   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:75-100% free   9:75-100% 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
  --------------------------------------------------------
End dump data blocks tsn: 4 file#: 3 minblk 9 maxblk 9


注意:在实际的情况中,每个一级位图块并非特定管理16个块的空间信息,当创建一个Uniform Size为5MB的表空间,其位图块要管理64个Block。

SQL> create tablespace test datafile '/opt/oracle/test.dbf' size 20M
  2  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 5M
  3  SEGMENT SPACE MANAGEMENT AUTO
  4  /
 
Tablespace created.


创建测试对象:

SQL> create table eyobj tablespace test as select * from dba_objects;
Table created.
 
< …Insert lots of rows …>
 
SQL> col segment_name for a20
SQL> SELECT segment_name, file_id, block_id, blocks
  2    FROM dba_extents
  3   WHERE tablespace_name = 'TEST';
SEGMENT_NAME            FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ----------
EYOBJ                         4          9        640
EYOBJ                         4        649        640
 
SQL> alter system dump datafile 4 block min 9 block max 11;
System altered.


简要转储信息:

……
scn: 0x0004.6c1ea061 seq: 0x03 flg: 0x04 tail: 0xa0612003
frmt: 0x02 chkval: 0x4b61 type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
 --------------------------------
   nbits : 4 nranges: 1         parent dba:  0x01000013   poffset: 0
   unformatted: 0       total: 64        first useful block: 12
  …….
  --------------------------------------------------------
  DBA  Ranges :
  --------------------------------------------------------
   0x01000009  Length: 64     Offset: 0
 
   0:Metadata   1:Metadata   2:Metadata   3:Metadata
   4:Metadata   5:Metadata   6:Metadata   7:Metadata
   8:Metadata   9:Metadata   10:Metadata   11:Metadata
   12:FULL   13:FULL   14:FULL   15:FULL
   16:FULL   17:FULL   18:FULL   19:FULL
   20:FULL   21:FULL   22:FULL   23:FULL
   24:FULL   25:FULL   26:FULL   27:FULL
   28:FULL   29:FULL   30:FULL   31:FULL
   32:FULL   33:FULL   34:FULL   35:FULL
   36:FULL   37:FULL   38:FULL   39:FULL
   40:FULL   41:FULL   42:FULL   43:FULL
   44:FULL   45:FULL   46:FULL   47:FULL
   48:FULL   49:FULL   50:FULL   51:FULL
   52:FULL   53:FULL   54:FULL   55:FULL
   56:FULL   57:FULL   58:FULL   59:FULL
   60:FULL   61:FULL   62:FULL   63:FULL
  --------------------------------------------------------


总结一下,ASSM的三级位图块的结构如图5-5所示:


image.png

图5-5  ASSM三级位图块示意图


通常Segment Header同时被认为是第一个三级位图块,这个位图块包含一系列指向二级位图块的指针,当这个数据块的空间不足以存储2级位图块的地址时,第一个真正独立的三级位图块将会产生。由于Segment Header已经可以胜任极大数据量的对象的空间管理,所以通常很难观察到其他三级位图块的出现。曾经有朋友创建了900G左右的数据表,仍然没有新的三级位图块出现。


为了验证以上结构猜想,进行以下测试实验,实验要能够实现:


(1)更快速的区间分配与扩展;

(2)使segment header尽量小,以便进一步扩展。


为此可以创建一个2kB block_size的表空间,设置uniform size区间大小为10kB,这样可以尽量缩减空间耗用:

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


创建一个数据表,设置高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  ;
表已创建。
 
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  /


这个表占用了大约9GB空间,用完了表空间的所有空间:

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


此时第一个3级位图块出现了。首先来看一下Segment Header,也就是PAGETABLE SEGMENT HEADER的信息,寻找Segment Header可以查询dba_segments视图:

SQL> select segment_name,header_file,header_block from dba_segments
  2  where segment_name='EYGLE';
SEGMENT_NAME         HEADER_FILE HEADER_BLOCK
-------------------- ----------- ------------
EYGLE                         12           35


转储数据文件12数据块35得到以下信息:

Start dump data blocks tsn: 12 file#: 12 minblk 35 maxblk 35
buffer tsn: 12 rdba: 0x03000023 (12/35)
scn: 0x0000.00bdd4ab seq: 0x04 flg: 0x04 tail: 0xd4ab2304
frmt: 0x02 chkval: 0xaece type: 0x23=PAGETABLE SEGMENT HEADER
  Extent Control Header
………….
  --------------------------------------------------------
  Segment Type: 1 nl2: 237    blksz: 2048   fbsz: 0     
  L2 Array start offset:  0x00000434
  First Level 3 BMB:  0x037d86de
  L2 Hint for inserts:  0x037fe15d
  Last Level 1 BMB:  0x037ffdcc
  Last Level II BMB:  0x037fe15d
  Last Level III BMB:  0x037d86de
     Map Header:: next  0x034000bf  #extents: 51   obj#: 33141  flag: 0x20000000
  Extent Map
  -----------------------------------------------------------------


注意这里的First Level 3 BMB和Last Level III BMB已经出现,同时指向了另外一个数据块0x037d86de,这个地址转换出来就是datafile 13 block 4032222:

SQL> select getbfno('0x037d86de') bfno from dual;
BFNO
------------------------------
datafile# is:13
datablock is:4032222

        

转储这个三级位图块的信息如下:

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


以上就是一个难得一见的三级位图块,这个位图块记录了一系列的L2级位图块地址,同时记录下一个三级位图块的指针(next)。为了取得这个三级位图块,在Segment Header上已经记录了237个二级指针:

   Second Level Bitmap block DBAs
   --------------------------------------------------------
   DBA 1:   0x03000022
   DBA 2:   0x03001963
   DBA 3:   0x030035a1
   DBA 4:   0x030057cf
   DBA 5:   0x03007d77
......
   DBA 236:   0x037cf03d
   DBA 237:   0x037d3b8d


进一步的插入数据,直至下一个三级位图块生成,此时Segment Header记录的信息如下:

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


这里记录的First Level 3 BMB仍然指向地址0x037d86de,而Last Level III BMB指向了新的三级位图块0x0472fcd7。再次转储此时的First Level 3 BMB 0x037d86de:

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

注意这里的Next指针已经指向了下一个三级位图块0x0472fcd7,

SQL> select getbfno('0x0472fcd7') bfno from dual;
BFNO
------------------------------
datafile# is:17
datablock is:3341527


最后记录一下这个新的三级位图块:

Start dump data blocks tsn: 12 file#: 17 minblk 3341527 maxblk 3341527
buffer tsn: 12 rdba: 0x0472fcd7 (17/3341527)
scn: 0x0000.00ff805c seq: 0x01 flg: 0x00 tail: 0x805c2201
frmt: 0x02 chkval: 0x0000 type: 0x22=THIRD LEVEL BITMAP BLOCK
Dump of Third Level Bitmap Block
   number: 22    , next :     0x00000000
  L2 Ranges :
  --------------------------------------------------------
     0x0472fcd6
     0x04734826     0x04739376     0x0473dec6     0x04742a16
     0x04747566     0x0474c0b6     0x04750c06     0x04755756
     0x0475a2a6     0x0475edf6     0x04763946     0x04768496
     0x0476cfe6     0x04771b36     0x04776686     0x0477b1d6
     0x0477fd26     0x04784876     0x047893c6     0x0478df16
     0x04792a66 
  --------------------------------------------------------
End dump data blocks tsn: 12 file#: 17 minblk 3341527 maxblk 3341527


根据以上的实验数据可以知道:ASSM的三级位图块之间以单向指针相连,Segment Header是一个例外,同时记录First和Last三级位图块的地址,使得三级位图块的链接形成了一个链接环,从而实现了三级位图块之间的导航。


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


· 一旦ASSM表空间被创建,DBA将无法控制表空间内部的数据表和索引的存储行为;

· ASSM不能用于创建临时的表空间,这是由排序时临时段的短暂特性决定的;

· 只有本地管理的表空间才能够使用ASSM管理技术(鉴于LMT已经成功地取代了DMT,这实际上已经算不上限制);

· 在高并发DML(例如INSERT、UPDATE和DELETE等)操作环境中,ASSM可能会出现性能上的问题。


正因为ASSM还不是太稳定与完善,所以至少在9iR2的版本上,还不建议生产系统中大规模使用ASSM的表空间。注意在Oracle 9i中,主要的缺省表空间都没有使用ASSM技术:

SQL> select * from v$version where rownum <2;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
SQL> select tablespace_name,extent_management,segment_space_management
  2  from dba_tablespaces;
TABLESPACE_NAME                EXTENT_MAN SEGMEN
------------------------------ ---------- ------
SYSTEM                         LOCAL      MANUAL
UNDOTBS1                       LOCAL      MANUAL
TEMP                           LOCAL      MANUAL
USERS                          LOCAL      MANUAL


当创建表空间时,Oracle缺省地使用手工段管理方式:

SQL> create tablespace eygle ;
Tablespace created.
 
SQL> select tablespace_name,extent_management,segment_space_management
  2  from dba_tablespaces where tablespace_name='EYGLE';
TABLESPACE_NAME                EXTENT_MAN SEGMEN
------------------------------ ---------- ------
EYGLE                          LOCAL      MANUAL


而在Oracle 10g/11g中,Oracle已经将ASSM技术逐渐应用到缺省表空间中:

SQL> select * from v$version where rownum <2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
SQL> select tablespace_name,extent_management,segment_space_management
  2  from dba_tablespaces;
TABLESPACE_NAME                EXTENT_MAN SEGMEN
------------------------------ ---------- ------
SYSTEM                         LOCAL      MANUAL
UNDOTBS1                       LOCAL      MANUAL
SYSAUX                         LOCAL      AUTO
TEMP                           LOCAL      MANUAL
USERS                          LOCAL      AUTO
SQL> select * from v$version where rownum <2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
 
SQL> select tablespace_name, extent_management, segment_space_management from dba_tablespaces;
TABLESPACE_NAME                EXTENT_MANAGEMENT SEGMENT_SPACE_MANAGEMENT
------------------------------ ----------------- ------------------------
SYSTEM                         LOCAL             MANUAL
UNDOTBS1                       LOCAL             MANUAL
SYSAUX                         LOCAL             AUTO
TEMP                           LOCAL             MANUAL
USERS                          LOCAL             AUTO


并且Oracle 10g/11g已经将ASSM作为默认的表空间管理模式:

SQL> create tablespace eygle;
Tablespace created.
 
SQL> SELECT tablespace_name, extent_management, allocation_type,
  2         segment_space_management
  3    FROM dba_tablespaces
  4   WHERE tablespace_name = 'EYGLE';
TABLESPACE_NAME                EXTENT_MAN ALLOCATIO SEGMEN
------------------------------ ---------- --------- ------
EYGLE                          LOCAL      SYSTEM    AUTO


这说明ASSM技术已经逐渐成熟,并且开始值得信赖。


要了解一项技术的另外一个侧面是参考Oracle的Bug列表,在Oracle 10g 10.2.0.3的补丁修正列表里,可以看到与ASSM有关的Bug修正,如表5-1所示。


表5-1                  与ASSM有关的Bug修正及其说明

image.png

 

如下是Oracle 11g 11.2.0.2中修正的关于ASSM的bug列表( ASSM Space Management - Bitmap Managed Segments 部分):

 

表5-2:11.2.0.2中修正的ASM Bug列表

image.png


当然,这些Bug大多数情况下都不会遇到,关注一下这些信息可以让我们从更多侧面了解Oracle技术。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论