1、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 whe
2、re segment_name=NEW01_JJ_1;HEADER_BLOCK HEADER_FILE SEGMENT_TYPE- - -119 TABLE步2:根据上面的显示结果可知,段头是在9号文件的第11号块,段头是第一个L3块,在L3中保存着L2块的地址,L2块保存着L1块的地址,L1块保存 着数据块的地址。所以想查找数据库的第一步,就是要先找到L3块,并在其中搜索可用的L2块,下面我们转储表的第一个L3块,即段头:9号文件11号块, 然后在其中搜索可用的L2块。转储命令如下: alter system dump datafile 9 block 11;系统已更改。转储结果如下:* 2
3、008-02-15 13:46:50.562* SERVICE NAMESYS$USERS) 2008-02-15 13:50.515* SESSION ID206.4) 2008-02-15 13:Start dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11buffer tsn: 11 rdba: 0x0240000b (9/11)scn: 0x0000.001e0767 seq: 0x01 flg: 0x04 tail: 0x07672301frmt: 0x02 chkval: 0x604a type: 0x23=PAGETABLE
4、 SEGMENT HEADERExtent Control Header-Extent Header: spare1: 0spare2:#extents: 5#blocks: 25 last map0x00000000#maps:offset: 2716Highwater:0x02400027ext#: 4blk#:ext size:#blocks in seg. hdrs freelists:#blocks below: 21mapblk Unlocked-Low HighWater Mark :Level 1 BMB for High HWM block: 0x0240001dLevel
5、1 BMB for Low HWM block:Segment Type: 1 nl2: 1blksz: 8192fbsz:L2 Array start offset:0x00001434First Level 3 BMB:0x00000000L2 Hint for inserts:0x0240000aLast Level 1 BMB:0x0240001dLast Level II BMB:Last Level III BMB:Map Header: next obj#: 52176flag: 0x10000000Inc # 0 Extent Map0x02400009length:0x024
6、0000e0x024000180x0240001d0x02400022Auxillary MapExtent 0L1 dba:0x02400009 Data dba:0x0240000cExtent 10x0240000eExtent 20x02400018Extent 30x0240001d Data dba:0x0240001eExtent 40x02400022Second Level Bitmap block DBAs DBA 1:End dump data blocks tsn:查看上面的信息,可知现在表New01_jj_1表中只有一个L2块,即9号文件第10号块。将来随着表的增大,
7、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号块: alter system dump datafile 9 block 10;52:03.359 9 minblk 10 maxblk 10 0x0
8、240000a (9/10) 0x07672101 0x4cfb type: 0x21=SECOND LEVEL BITMAP BLOCKDump of Second Level Bitmap Blocknumber: 2 nfree: ffree:pdba:0x0240000b Inc #: 0 Objd: 52176opcode:0 xid:L1 Ranges :Free: 1 Inst: 1 3 Inst:这里我们看到 L2块中有两个L1块 分别是 9号块 和 29号块,到这一步,Oracle如何在L2中选择L1?为了提高插入的并行度,这里将根据完成插入操作服务器进程的PID,计算出一个Hash值,根据 此Hash值在多个L1中选择一个。也就是在多个L1中根据进程PID随机选择一个。此处要注意的是,高高水点(不是输入错误,高水点在ASSM中有两 个:低高水点和高高水点)之后的块不在选择范围内。如果从两个会话中插入,Oracle会尽量将这两个进程分配到两个L1块中。假设,这里选择了29号,我们再来转储它。步4: alter system dump datafile 9 block 29;* 2008-02-15 14:00:26.078 9 minblk 29 maxblk 29 0x0240001d (9/29) 0x000
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1