没有必胜的秘籍,没有方程式遵循~~
要赢~~只有全身心的投入!
晶晶实验_插入时寻找空闲块的步骤篇(ASSM表空间)
上一篇 / 下一篇 2008-02-15 21:16:15 / 个人分类:晶晶oracle实验系列
查看( 2644 ) /
评论( 54 )
服务器进程寻找空闲块的步骤:ITPUB个人空间;\dIoMJ}v
在ASSM表空间中,执行Insert声明时,Oracle是如何为声明分配可用块的?
a b"l:V4\0 以前已经有网友论证,在ASSM中,可用块的管理,由L3、L2和L1三级位图块实现。具体的步骤就是,先通过数据字典找到段头,而段头其实就是表的第一个L3块,在其中寻找L2。根据执行插入声明的服务器进程的PID,计算出一个随机HASH值,根据此HASH值,在L2中找到一个L1。再根据服务器进程的PID,在L1中查找一个可用的数据块,并在其中插入新行。具体的步骤如下:ITPUB个人空间"T3Z&j USDP
步1:
7~'HW3Qg8[0 我的实验环境如下:ITPUB个人空间'dmaUA+^
块大小:8K;区大小40K;实验表现占5个区;ITPUB个人空间UewOvX W6caI
假设现在用户端发来命令如下:ITPUB个人空间r3Gf3}5om7R
Insert into new01_jj_1 values(1,’a’);ITPUB个人空间D R,I-Vn7M*M4rzQ
首先,对于new01_jj_1,数据库并不理解这是什么,Oracle首先要去查询数据字典表,了解这一串字母的具体意义,例如,Oracle要确定这是一个视图、同义词,或是一个表等等,这些操作,就是递归操作,我们只拣和我们今天的论题相关的说,Oracle要先查找seg$数据字典表,找出段头的文件号和块号,我们将这一步操作化为对基于seg$数据字典表的视图:Dba_segments的操作:
C:OW'aC+ve0 SQL> select header_block,header_file,segment_type from dba_segments where segment_name='NEW01_JJ_1';ITPUB个人空间C:R9s3im
HEADER_BLOCK HEADER_FILE SEGMENT_TYPEITPUB个人空间p] N'd_!{];a
------------ ----------- ------------------
S z?PX!h l0 11 9 TABLEITPUB个人空间 x?"h;omXD3]
步2:根据上面的显示结果可知,段头是在9号文件的第11号块,段头是第一个L3块,在L3中保存着L2块的地址,L2块保存着L1块的地址,L1块保存着数据块的地址。所以想查找数据库的第一步,就是要先找到L3块,并在其中搜索可用的L2块,下面我们转储表的第一个L3块,即段头:9号文件11号块,然后在其中搜索可用的L2块。
{(YtH;p#f} H-b$p0 转储命令如下:
#q2Fra;hcO!^(^0 SQL> alter system dump datafile 9 block 11;ITPUB个人空间fe9x1iyj$A
系统已更改。
X!c R1?s8p0^9Tn^0 转储结果如下:
~ T(uQ&Kf c0 *** 2008-02-15 13:46:50.562ITPUB个人空间7P[)Ft|Lm zQ
*** SERVICE NAME
SYS$USERS) 2008-02-15 13:46:50.515ITPUB个人空间6N2{tJ&Xh`
*** SESSION ID
206.4) 2008-02-15 13:46:50.515
!h*D9A0K.itK` C0 Start dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11ITPUB个人空间$] bbMM1NQ6R!]
buffer tsn: 11 rdba: 0x0240000b (9/11)ITPUB个人空间F&T6?t@-GU
scn: 0x0000.001e0767 seq: 0x01 flg: 0x04 tail: 0x07672301ITPUB个人空间cH"u7E4omq%Luo
frmt: 0x02 chkval: 0x604a type: 0x23=PAGETABLE SEGMENT HEADERITPUB个人空间.X3l I E&ii N
Extent Control Header
6\K:QP&dy&q0 -----------------------------------------------------------------ITPUB个人空间D Ac$VI ZL,K0K0P.]
Extent Header:: spare1: 0 spare2: 0 #extents: 5 #blocks: 25
^0]]%J*{J;~:A0 last map 0x00000000 #maps: 0 offset: 2716 ITPUB个人空间$G'C?$w"Z5T KH2P
Highwater:: 0x02400027 ext#: 4 blk#: 5 ext size: 5
*RFeZQ&T2N0 #blocks in seg. hdr's freelists: 0 ITPUB个人空间a S'V1_ gF
#blocks below: 21
a7\P-^Ag0zkX0 mapblk 0x00000000 offset: 4
Oy,r&M0Y toW0 UnlockedITPUB个人空间|)~7n)V^8UuPy/W,e
--------------------------------------------------------
B~w;i6U6Q0 Low HighWater Mark :
$[-x#w'L`[D0 Highwater:: 0x02400027 ext#: 4 blk#: 5 ext size: 5
B(zPn+ZS0 #blocks in seg. hdr's freelists: 0
nLPJo%WH0 #blocks below: 21
在ASSM表空间中,执行Insert声明时,Oracle是如何为声明分配可用块的?
a b"l:V4\0 以前已经有网友论证,在ASSM中,可用块的管理,由L3、L2和L1三级位图块实现。具体的步骤就是,先通过数据字典找到段头,而段头其实就是表的第一个L3块,在其中寻找L2。根据执行插入声明的服务器进程的PID,计算出一个随机HASH值,根据此HASH值,在L2中找到一个L1。再根据服务器进程的PID,在L1中查找一个可用的数据块,并在其中插入新行。具体的步骤如下:ITPUB个人空间"T3Z&j USDP
步1:
7~'HW3Qg8[0 我的实验环境如下:ITPUB个人空间'dmaUA+^
块大小:8K;区大小40K;实验表现占5个区;ITPUB个人空间UewOvX W6caI
假设现在用户端发来命令如下:ITPUB个人空间r3Gf3}5om7R
Insert into new01_jj_1 values(1,’a’);ITPUB个人空间D R,I-Vn7M*M4rzQ
首先,对于new01_jj_1,数据库并不理解这是什么,Oracle首先要去查询数据字典表,了解这一串字母的具体意义,例如,Oracle要确定这是一个视图、同义词,或是一个表等等,这些操作,就是递归操作,我们只拣和我们今天的论题相关的说,Oracle要先查找seg$数据字典表,找出段头的文件号和块号,我们将这一步操作化为对基于seg$数据字典表的视图:Dba_segments的操作:
C:OW'aC+ve0 SQL> select header_block,header_file,segment_type from dba_segments where segment_name='NEW01_JJ_1';ITPUB个人空间C:R9s3im
HEADER_BLOCK HEADER_FILE SEGMENT_TYPEITPUB个人空间p] N'd_!{];a
------------ ----------- ------------------
S z?PX!h l0 11 9 TABLEITPUB个人空间 x?"h;omXD3]
步2:根据上面的显示结果可知,段头是在9号文件的第11号块,段头是第一个L3块,在L3中保存着L2块的地址,L2块保存着L1块的地址,L1块保存着数据块的地址。所以想查找数据库的第一步,就是要先找到L3块,并在其中搜索可用的L2块,下面我们转储表的第一个L3块,即段头:9号文件11号块,然后在其中搜索可用的L2块。
{(YtH;p#f} H-b$p0 转储命令如下:
#q2Fra;hcO!^(^0 SQL> alter system dump datafile 9 block 11;ITPUB个人空间fe9x1iyj$A
系统已更改。
X!c R1?s8p0^9Tn^0 转储结果如下:
~ T(uQ&Kf c0 *** 2008-02-15 13:46:50.562ITPUB个人空间7P[)Ft|Lm zQ
*** SERVICE NAME
SYS$USERS) 2008-02-15 13:46:50.515ITPUB个人空间6N2{tJ&Xh`*** SESSION ID
206.4) 2008-02-15 13:46:50.515!h*D9A0K.itK` C0 Start dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11ITPUB个人空间$] bbMM1NQ6R!]
buffer tsn: 11 rdba: 0x0240000b (9/11)ITPUB个人空间F&T6?t@-GU
scn: 0x0000.001e0767 seq: 0x01 flg: 0x04 tail: 0x07672301ITPUB个人空间cH"u7E4omq%Luo
frmt: 0x02 chkval: 0x604a type: 0x23=PAGETABLE SEGMENT HEADERITPUB个人空间.X3l I E&ii N
Extent Control Header
6\K:QP&dy&q0 -----------------------------------------------------------------ITPUB个人空间D Ac$VI ZL,K0K0P.]
Extent Header:: spare1: 0 spare2: 0 #extents: 5 #blocks: 25
^0]]%J*{J;~:A0 last map 0x00000000 #maps: 0 offset: 2716 ITPUB个人空间$G'C?$w"Z5T KH2P
Highwater:: 0x02400027 ext#: 4 blk#: 5 ext size: 5
*RFeZQ&T2N0 #blocks in seg. hdr's freelists: 0 ITPUB个人空间a S'V1_ gF
#blocks below: 21
a7\P-^Ag0zkX0 mapblk 0x00000000 offset: 4
Oy,r&M0Y toW0 UnlockedITPUB个人空间|)~7n)V^8UuPy/W,e
--------------------------------------------------------
B~w;i6U6Q0 Low HighWater Mark :
$[-x#w'L`[D0 Highwater:: 0x02400027 ext#: 4 blk#: 5 ext size: 5
B(zPn+ZS0 #blocks in seg. hdr's freelists: 0
nLPJo%WH0 #blocks below: 21