没有必胜的秘籍,没有方程式遵循~~
要赢~~只有全身心的投入!
晶晶实验_插入时寻找空闲块的步骤篇(ASSM表空间)
上一篇 / 下一篇 2008-02-15 21:16:15 / 个人分类:晶晶oracle实验系列
查看( 2018 ) /
评论( 53 )
服务器进程寻找空闲块的步骤:
Q e!}/v ^2PB|0 在ASSM表空间中,执行Insert声明时,Oracle是如何为声明分配可用块的?ITPUB个人空间4PC(LA I
以前已经有网友论证,在ASSM中,可用块的管理,由L3、L2和L1三级位图块实现。具体的步骤就是,先通过数据字典找到段头,而段头其实就是表的第一个L3块,在其中寻找L2。根据执行插入声明的服务器进程的PID,计算出一个随机HASH值,根据此HASH值,在L2中找到一个L1。再根据服务器进程的PID,在L1中查找一个可用的数据块,并在其中插入新行。具体的步骤如下:
3V,|g&Z?*vI(H0 步1:
:f^_0Y_+z'G}0 我的实验环境如下:
}%[2O Emv$I C8q0 块大小:8K;区大小40K;实验表现占5个区;
'S5N5r'O$K4L/a0 假设现在用户端发来命令如下:ITPUB个人空间0M HCGS`R
Insert into new01_jj_1 values(1,’a’);
@S f+D8d0LKZ:K~0 首先,对于new01_jj_1,数据库并不理解这是什么,Oracle首先要去查询数据字典表,了解这一串字母的具体意义,例如,Oracle要确定这是一个视图、同义词,或是一个表等等,这些操作,就是递归操作,我们只拣和我们今天的论题相关的说,Oracle要先查找seg$数据字典表,找出段头的文件号和块号,我们将这一步操作化为对基于seg$数据字典表的视图:Dba_segments的操作:ITPUB个人空间XZT e"F,])j+D1CE h
SQL> select header_block,header_file,segment_type from dba_segments where segment_name='NEW01_JJ_1';
2O:J;KaKTlF3I-I0 HEADER_BLOCK HEADER_FILE SEGMENT_TYPE
n.Emfw&X~!uX0 ------------ ----------- ------------------
W.zG`%w*v:A~[ b9h0 11 9 TABLE
#R,g@Z1O1r0 步2:根据上面的显示结果可知,段头是在9号文件的第11号块,段头是第一个L3块,在L3中保存着L2块的地址,L2块保存着L1块的地址,L1块保存着数据块的地址。所以想查找数据库的第一步,就是要先找到L3块,并在其中搜索可用的L2块,下面我们转储表的第一个L3块,即段头:9号文件11号块,然后在其中搜索可用的L2块。
G_U6n&dOP4N0 转储命令如下:ITPUB个人空间U6I"qHFJ4j
SQL> alter system dump datafile 9 block 11;
3S(d:t%as)x#S0 系统已更改。ITPUB个人空间#kmHl-f1]4W.}
转储结果如下:ITPUB个人空间BSR,G$H^1P
*** 2008-02-15 13:46:50.562
Chw!Rv7VX M+y0 *** SERVICE NAME
SYS$USERS) 2008-02-15 13:46:50.515ITPUB个人空间'FK$w8DK5j+?
*** SESSION ID
206.4) 2008-02-15 13:46:50.515ITPUB个人空间:U4Ol iy(Z9X.r;tYD0z
Start dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11
yq VG9~/y!h+k0 buffer tsn: 11 rdba: 0x0240000b (9/11)
6Vp:] S P{u0 scn: 0x0000.001e0767 seq: 0x01 flg: 0x04 tail: 0x07672301
I.\eK8a0 frmt: 0x02 chkval: 0x604a type: 0x23=PAGETABLE SEGMENT HEADER
U+g&xP.Ax u0 Extent Control Header
GD:~I-a:y7A0 -----------------------------------------------------------------ITPUB个人空间n\(dq v0qC
Extent Header:: spare1: 0 spare2: 0 #extents: 5 #blocks: 25 ITPUB个人空间.hoV"cS%v&R/G
last map 0x00000000 #maps: 0 offset: 2716
)bE~~%Vj0 Highwater:: 0x02400027 ext#: 4 blk#: 5 ext size: 5
,cs;QPs @1c0 #blocks in seg. hdr's freelists: 0 ITPUB个人空间5nA#q*fV y)Ra^
#blocks below: 21 ITPUB个人空间'R'CH+|#dD;w[7v8Q
mapblk 0x00000000 offset: 4
!Q s?u.M0 UnlockedITPUB个人空间2qX&r$d.zZ
--------------------------------------------------------
Y-fx#Z0L0 Low HighWater Mark : ITPUB个人空间+PV-W$K'bG"j)Q
Highwater:: 0x02400027 ext#: 4 blk#: 5 ext size: 5 ITPUB个人空间,ew!\aW4h
#blocks in seg. hdr's freelists: 0
As!~8d5[+}1S0 #blocks below: 21 ITPUB个人空间,c n]H(GU
mapblk 0x00000000 offset: 4 ITPUB个人空间'Fg)PR;J9z
Level 1 BMB for High HWM block: 0x0240001d
@S)r:^"x-z8vk}v0 Level 1 BMB for Low HWM block: 0x0240001d
5]PcgO%Mo)~0 --------------------------------------------------------
oa!}(lu8^I0 Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0 ITPUB个人空间5w vx['J9wpV/W
L2 Array start offset: 0x00001434ITPUB个人空间^,so)M7}? E
First Level 3 BMB: 0x00000000
3V[0N(`c Z;~0 L2 Hint for inserts: 0x0240000a
\%E(lujm J0 Last Level 1 BMB: 0x0240001dITPUB个人空间au&o0[E
Last Level II BMB: 0x0240000a
cb uI.v\.@+d$?0 Last Level III BMB: 0x00000000ITPUB个人空间p0@v\8FQ w V
Map Header:: next 0x00000000 #extents: 5 obj#: 52176 flag: 0x10000000ITPUB个人空间c&b%SA*O,u
Inc # 0 ITPUB个人空间wZ.K!c ]
Extent Map
9fuk0u2p? A1Vw0e]0 -----------------------------------------------------------------ITPUB个人空间ARVRN'Kbhq3N
0x02400009 length: 5
:_3R`ty'u(pGN0 0x0240000e length: 5 ITPUB个人空间gTL9FUw
0x02400018 length: 5
#AL8T+m.S;i.k_0 0x0240001d length: 5 ITPUB个人空间8b8q|VI'EK
0x02400022 length: 5
N%X6~w,`#p,y6^0
"M%A2T-j7h9ujT^b*D0 Auxillary Map
rRK:~;Gf N0i"LlG0 --------------------------------------------------------ITPUB个人空间N8qV g:J$ys;Xj
Extent 0 : L1 dba: 0x02400009 Data dba: 0x0240000cITPUB个人空间 ^+Y2h#J3C4O]{
Extent 1 : L1 dba: 0x02400009 Data dba: 0x0240000eITPUB个人空间,G"`M/o5|w$xXr
Extent 2 : L1 dba: 0x02400009 Data dba: 0x02400018ITPUB个人空间2kJys%~fu
Extent 3 : L1 dba: 0x0240001d Data dba: 0x0240001e
+o5iS:fo't3SJs/G0 Extent 4 : L1 dba: 0x0240001d Data dba: 0x02400022
SSS|d8]0 --------------------------------------------------------
l;r nP |6F){+J \;C0
#c{6pE\ tc;J(b0 Second Level Bitmap block DBAs ITPUB个人空间Kz N&{4o|9[ Oe
--------------------------------------------------------
5{X0s/czt0 DBA 1: 0x0240000a
a)[P&jx4u l]?H0 ITPUB个人空间h*C#lET~
End dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11ITPUB个人空间3MHV1zX4ZPp*X
ITPUB个人空间!R.Y'p*ht5GE3fO
查看上面的信息,可知现在表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块。ITPUB个人空间r2o G8c2S'lDcH
步3:转储L2块9号文件10号块:ITPUB个人空间a$p5C {"i'Db1p%B`/N
SQL> alter system dump datafile 9 block 10;
? eE(J gLm0 系统已更改。ITPUB个人空间#~$F3m*S~z` F
*** 2008-02-15 13:52:03.359ITPUB个人空间RIXhl%GQ2\8J]$@(c-N
Start dump data blocks tsn: 11 file#: 9 minblk 10 maxblk 10ITPUB个人空间uE1bB G_XsiJZ
buffer tsn: 11 rdba: 0x0240000a (9/10)
pz8x&D
Q e!}/v ^2PB|0 在ASSM表空间中,执行Insert声明时,Oracle是如何为声明分配可用块的?ITPUB个人空间4PC(LA I
以前已经有网友论证,在ASSM中,可用块的管理,由L3、L2和L1三级位图块实现。具体的步骤就是,先通过数据字典找到段头,而段头其实就是表的第一个L3块,在其中寻找L2。根据执行插入声明的服务器进程的PID,计算出一个随机HASH值,根据此HASH值,在L2中找到一个L1。再根据服务器进程的PID,在L1中查找一个可用的数据块,并在其中插入新行。具体的步骤如下:
3V,|g&Z?*vI(H0 步1:
:f^_0Y_+z'G}0 我的实验环境如下:
}%[2O Emv$I C8q0 块大小:8K;区大小40K;实验表现占5个区;
'S5N5r'O$K4L/a0 假设现在用户端发来命令如下:ITPUB个人空间0M HCGS`R
Insert into new01_jj_1 values(1,’a’);
@S f+D8d0LKZ:K~0 首先,对于new01_jj_1,数据库并不理解这是什么,Oracle首先要去查询数据字典表,了解这一串字母的具体意义,例如,Oracle要确定这是一个视图、同义词,或是一个表等等,这些操作,就是递归操作,我们只拣和我们今天的论题相关的说,Oracle要先查找seg$数据字典表,找出段头的文件号和块号,我们将这一步操作化为对基于seg$数据字典表的视图:Dba_segments的操作:ITPUB个人空间XZT e"F,])j+D1CE h
SQL> select header_block,header_file,segment_type from dba_segments where segment_name='NEW01_JJ_1';
2O:J;KaKTlF3I-I0 HEADER_BLOCK HEADER_FILE SEGMENT_TYPE
n.Emfw&X~!uX0 ------------ ----------- ------------------
W.zG`%w*v:A~[ b9h0 11 9 TABLE
#R,g@Z1O1r0 步2:根据上面的显示结果可知,段头是在9号文件的第11号块,段头是第一个L3块,在L3中保存着L2块的地址,L2块保存着L1块的地址,L1块保存着数据块的地址。所以想查找数据库的第一步,就是要先找到L3块,并在其中搜索可用的L2块,下面我们转储表的第一个L3块,即段头:9号文件11号块,然后在其中搜索可用的L2块。
G_U6n&dOP4N0 转储命令如下:ITPUB个人空间U6I"qHFJ4j
SQL> alter system dump datafile 9 block 11;
3S(d:t%as)x#S0 系统已更改。ITPUB个人空间#kmHl-f1]4W.}
转储结果如下:ITPUB个人空间BSR,G$H^1P
*** 2008-02-15 13:46:50.562
Chw!Rv7VX M+y0 *** SERVICE NAME
SYS$USERS) 2008-02-15 13:46:50.515ITPUB个人空间'FK$w8DK5j+?*** SESSION ID
206.4) 2008-02-15 13:46:50.515ITPUB个人空间:U4Ol iy(Z9X.r;tYD0zStart dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11
yq VG9~/y!h+k0 buffer tsn: 11 rdba: 0x0240000b (9/11)
6Vp:] S P{u0 scn: 0x0000.001e0767 seq: 0x01 flg: 0x04 tail: 0x07672301
I.\eK8a0 frmt: 0x02 chkval: 0x604a type: 0x23=PAGETABLE SEGMENT HEADER
U+g&xP.Ax u0 Extent Control Header
GD:~I-a:y7A0 -----------------------------------------------------------------ITPUB个人空间n\(dq v0qC
Extent Header:: spare1: 0 spare2: 0 #extents: 5 #blocks: 25 ITPUB个人空间.hoV"cS%v&R/G
last map 0x00000000 #maps: 0 offset: 2716
)bE~~%Vj0 Highwater:: 0x02400027 ext#: 4 blk#: 5 ext size: 5
,cs;QPs @1c0 #blocks in seg. hdr's freelists: 0 ITPUB个人空间5nA#q*fV y)Ra^
#blocks below: 21 ITPUB个人空间'R'CH+|#dD;w[7v8Q
mapblk 0x00000000 offset: 4
!Q s?u.M0 UnlockedITPUB个人空间2qX&r$d.zZ
--------------------------------------------------------
Y-fx#Z0L0 Low HighWater Mark : ITPUB个人空间+PV-W$K'bG"j)Q
Highwater:: 0x02400027 ext#: 4 blk#: 5 ext size: 5 ITPUB个人空间,ew!\aW4h
#blocks in seg. hdr's freelists: 0
As!~8d5[+}1S0 #blocks below: 21 ITPUB个人空间,c n]H(GU
mapblk 0x00000000 offset: 4 ITPUB个人空间'Fg)PR;J9z
Level 1 BMB for High HWM block: 0x0240001d
@S)r:^"x-z8vk}v0 Level 1 BMB for Low HWM block: 0x0240001d
5]PcgO%Mo)~0 --------------------------------------------------------
oa!}(lu8^I0 Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0 ITPUB个人空间5w vx['J9wpV/W
L2 Array start offset: 0x00001434ITPUB个人空间^,so)M7}? E
First Level 3 BMB: 0x00000000
3V[0N(`c Z;~0 L2 Hint for inserts: 0x0240000a
\%E(lujm J0 Last Level 1 BMB: 0x0240001dITPUB个人空间au&o0[E
Last Level II BMB: 0x0240000a
cb uI.v\.@+d$?0 Last Level III BMB: 0x00000000ITPUB个人空间p0@v\8FQ w V
Map Header:: next 0x00000000 #extents: 5 obj#: 52176 flag: 0x10000000ITPUB个人空间c&b%SA*O,u
Inc # 0 ITPUB个人空间wZ.K!c ]
Extent Map
9fuk0u2p? A1Vw0e]0 -----------------------------------------------------------------ITPUB个人空间ARVRN'Kbhq3N
0x02400009 length: 5
:_3R`ty'u(pGN0 0x0240000e length: 5 ITPUB个人空间gTL9FUw
0x02400018 length: 5
#AL8T+m.S;i.k_0 0x0240001d length: 5 ITPUB个人空间8b8q|VI'EK
0x02400022 length: 5
N%X6~w,`#p,y6^0
"M%A2T-j7h9ujT^b*D0 Auxillary Map
rRK:~;Gf N0i"LlG0 --------------------------------------------------------ITPUB个人空间N8qV g:J$ys;Xj
Extent 0 : L1 dba: 0x02400009 Data dba: 0x0240000cITPUB个人空间 ^+Y2h#J3C4O]{
Extent 1 : L1 dba: 0x02400009 Data dba: 0x0240000eITPUB个人空间,G"`M/o5|w$xXr
Extent 2 : L1 dba: 0x02400009 Data dba: 0x02400018ITPUB个人空间2kJys%~fu
Extent 3 : L1 dba: 0x0240001d Data dba: 0x0240001e
+o5iS:fo't3SJs/G0 Extent 4 : L1 dba: 0x0240001d Data dba: 0x02400022
SSS|d8]0 --------------------------------------------------------
l;r nP |6F){+J \;C0
#c{6pE\ tc;J(b0 Second Level Bitmap block DBAs ITPUB个人空间Kz N&{4o|9[ Oe
--------------------------------------------------------
5{X0s/czt0 DBA 1: 0x0240000a
a)[P&jx4u l]?H0 ITPUB个人空间h*C#lET~
End dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11ITPUB个人空间3MHV1zX4ZPp*X
ITPUB个人空间!R.Y'p*ht5GE3fO
查看上面的信息,可知现在表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块。ITPUB个人空间r2o G8c2S'lDcH
步3:转储L2块9号文件10号块:ITPUB个人空间a$p5C {"i'Db1p%B`/N
SQL> alter system dump datafile 9 block 10;
? eE(J gLm0 系统已更改。ITPUB个人空间#~$F3m*S~z` F
*** 2008-02-15 13:52:03.359ITPUB个人空间RIXhl%GQ2\8J]$@(c-N
Start dump data blocks tsn: 11 file#: 9 minblk 10 maxblk 10ITPUB个人空间uE1bB G_XsiJZ
buffer tsn: 11 rdba: 0x0240000a (9/10)
pz8x&D