晶晶实验一_插入时寻找空闲块的步骤篇(ASSM表空间)

晶晶实验一_插入时寻找空闲块的步骤篇(ASSM表空间)




服务器进程寻找空闲块的步骤:
        在ASSM表空间中,执行Insert声明时,Oracle是如何为声明分配可用块的?
        以前已经有网友论证,在ASSM中,可用块的管理,由L3、L2和L1三级位图块实现。具体的步骤就是,先通过数据字典找到段头,而段头其实就是表的第一个L3块,在其中寻找L2。根据执行插入声明的服务器进程的PID,计算出一个随机HASH值,根据此HASH值,在L2中找到一个L1。再根据服务器进程的PID,在L1中查找一个可用的数据块,并在其中插入新行。具体的步骤如下:
步1:
        我的实验环境如下:
块大小:8K;区大小40K;实验表现占5个区;
        假设现在用户端发来命令如下:
        Insert into new01_jj_1 values(1,’a’);
        首先,对于new01_jj_1,数据库并不理解这是什么,Oracle首先要去查询数据字典表,了解这一串字母的具体意义,例如,Oracle要确定这是一个视图、同义词,或是一个表等等,这些操作,就是递归操作,我们只拣和我们今天的论题相关的说,Oracle要先查找seg$数据字典表,找出段头的文件号和块号,我们将这一步操作化为对基于seg$数据字典表的视图:DBA_segments的操作:
SQL> select header_block,header_file,segment_type from dba_segments where segment_name='NEW01_JJ_1';
HEADER_BLOCK HEADER_FILE SEGMENT_TYPE
------------ ----------- ------------------
11        9 TABLE
步2:根据上面的显示结果可知,段头是在9号文件的第11号块,段头是第一个L3块,在L3中保存着L2块的地址,L2块保存着L1块的地址,L1块保存着数据块的地址。所以想查找数据库的第一步,就是要先找到L3块,并在其中搜索可用的L2块,下面我们转储表的第一个L3块,即段头:9号文件11号块,然后在其中搜索可用的L2块。
转储命令如下:
SQL> alter system dump datafile 9 block 11;
系统已更改。
转储结果如下:
*** 2008-02-15 13:46:50.562
*** SERVICE NAMESYS$USERS) 2008-02-15 13:46:50.515
*** SESSION ID206.4) 2008-02-15 13:46:50.515
Start dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11
buffer tsn: 11 rdba: 0x0240000b (9/11)
scn: 0x0000.001e0767 seq: 0x01 flg: 0x04 tail: 0x07672301
frmt: 0x02 chkval: 0x604a type: 0x23=PAGETABLE SEGMENT HEADER
  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 5      #blocks: 25   
                  last map  0x00000000  #maps: 0      offset: 2716  
      Highwater::  0x02400027  ext#: 4      blk#: 5      ext size: 5     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 21   
  mapblk  0x00000000  offset: 4     
                   Unlocked
  --------------------------------------------------------
  Low HighWater Mark :
      Highwater::  0x02400027  ext#: 4      blk#: 5      ext size: 5     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 21   
  mapblk  0x00000000  offset: 4     
  Level 1 BMB for High HWM block: 0x0240001d
  Level 1 BMB for Low HWM block: 0x0240001d
  --------------------------------------------------------
  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0      
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x0240000a
  Last Level 1 BMB:  0x0240001d
  Last Level II BMB:  0x0240000a
  Last Level III BMB:  0x00000000
     Map Header:: next  0x00000000  #extents: 5    obj#: 52176  flag: 0x10000000
  Inc # 0
  Extent Map
  -----------------------------------------------------------------
   0x02400009  length: 5     
   0x0240000e  length: 5     
   0x02400018  length: 5     
   0x0240001d  length: 5     
   0x02400022  length: 5     
  
  Auxillary Map
  --------------------------------------------------------
   Extent 0     :  L1 dba:  0x02400009 Data dba:  0x0240000c
   Extent 1     :  L1 dba:  0x02400009 Data dba:  0x0240000e
   Extent 2     :  L1 dba:  0x02400009 Data dba:  0x02400018
   Extent 3     :  L1 dba:  0x0240001d Data dba:  0x0240001e
   Extent 4     :  L1 dba:  0x0240001d Data dba:  0x02400022
  --------------------------------------------------------
  
   Second Level Bitmap block DBAs
   --------------------------------------------------------
   DBA 1:   0x0240000a
  
End dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11

查看上面的信息,可知现在表New01_jj_1表中只有一个L2块,即9号文件第10号块。将来随着表的增大,L1块的增多,L2块也会逐步增多。那么,在L3中记录的L2也会随之增多,如何在众多L2块中快速找到一个可用的L2块呢?Oracle专门增设了一个L2 Hint for inserts,此处的值为0x0240000a,即第9号文件10号块。我们可以直接根据L2 Hint for inserts中的指示,找出可用的L2块,此处为第9号文件10号块,这就是在L3中查找L2的步骤,下面,我们转储L2,并在其中查找L1块。
步3:转储L2块9号文件10号块:
SQL> alter system dump datafile 9 block 10;
系统已更改。
*** 2008-02-15 13:52:03.359
Start dump data blocks tsn: 11 file#: 9 minblk 10 maxblk 10
buffer tsn: 11 rdba: 0x0240000a (9/10)
scn: 0x0000.001e0767 seq: 0x01 flg: 0x04 tail: 0x07672101
frmt: 0x02 chkval: 0x4cfb type: 0x21=SECOND LEVEL BITMAP BLOCK

Dump of Second Level Bitmap Block
   number: 2       nfree: 1       ffree: 1      pdba:     0x0240000b
   Inc #: 0 Objd: 52176
  opcode:0
xid:
  L1 Ranges :
  --------------------------------------------------------
   0x02400009  Free: 1 Inst: 1
   0x0240001d  Free: 3 Inst: 1
  
  --------------------------------------------------------
End dump data blocks tsn: 11 file#: 9 minblk 10 maxblk 10
这里我们看到 L2块中有两个L1块 分别是 9号块 和 29号块,到这一步,Oracle如何在L2中选择L1?为了提高插入的并行度,这里将根据完成插入操作服务器进程的PID,计算出一个Hash值,根据此Hash值在多个L1中选择一个。也就是在多个L1中根据进程PID随机选择一个。此处要注意的是,高高水点(不是输入错误,高水点在ASSM中有两个:低高水点和高高水点)之后的块不在选择范围内。
如果从两个会话中插入,Oracle会尽量将这两个进程分配到两个L1块中。
        假设,这里选择了29号,我们再来转储它。
步4:
SQL> alter system dump datafile 9 block 29;
系统已更改。
*** 2008-02-15 14:00:26.078
Start dump data blocks tsn: 11 file#: 9 minblk 29 maxblk 29
buffer tsn: 11 rdba: 0x0240001d (9/29)
scn: 0x0000.001e0767 seq: 0x0c flg: 0x04 tail: 0x0767200c
frmt: 0x02 chkval: 0x4faa type: 0x20=FIRST LEVEL BITMAP BLOCK
Dump of First Level Bitmap Block
--------------------------------
   nbits : 4 nranges: 2         parent dba:  0x0240000a   poffset: 1     
   unformatted: 0       total: 10        first useful block: 1      
   owning instance : 1
   instance ownership changed at 02/15/2008 12:01:34
   Last successful Search 02/15/2008 12:01:34
   Freeness Status:  nf1 0      nf2 1      nf3 0      nf4 0      

   Extent Map Block Offset: 4294967295
  First free datablock : 5      
   Bitmap block lock opcode 0
   Locker xid:     :  0x0000.000.00000000
   Inc #: 0 Objd: 52176
  HWM Flag: HWM Set
      Highwater::  0x02400027  ext#: 4      blk#: 5      ext size: 5     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 21   
  mapblk  0x00000000  offset: 4     
  --------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x0240001d  Length: 5      Offset: 0      
   0x02400022  Length: 5      Offset: 5      
  
   0:Metadata   1:FULL   2:FULL   3:FULL
   4:FULL   5:25-50% free   6:FULL   7:FULL
   8:FULL   9:FULL
  --------------------------------------------------------
End dump data blocks tsn: 11 file#: 9 minblk 29 maxblk 29
        此L1块中包含10个数据块,在这10个块中的选择,Oracle也是根据进程的PID,随机挑选。同样,两个不同进程发布的插入,Oracle会尽量使其插入进不同的数据块中,以提高并发性。
标签: 暂无标签
fishcat

写了 55 篇文章,拥有财富 503,被 40 人关注

oracle爱好者
转播转播 分享分享 分享淘帖
回复

使用道具

成为第一个吐槽的人

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈