没有必胜的秘籍,没有方程式遵循~~ 要赢~~只有全身心的投入!

晶晶实验_插入时寻找空闲块的步骤篇(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个人空间'dma UA+^
块大小: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&Kfc0 *** 2008-02-15 13:46:50.562ITPUB个人空间7P[)Ft|Lm zQ
*** SERVICE NAMESYS$USERS) 2008-02-15 13:46:50.515ITPUB个人空间6N2{tJ&Xh`
*** SESSION ID206.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 IE&ii N
  Extent Control Header
6\K:QP&dy&q0   -----------------------------------------------------------------ITPUB个人空间DAc$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个人空间aS'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(z Pn+ZS0   #blocks in seg. hdr's freelists: 0     
nLP Jo%WH0   #blocks below: 21   
Oz A W`T7h6m"S k0   mapblk  0x00000000  offset: 4     
J0K)VD3OF0   Level 1 BMB for High HWM block: 0x0240001dITPUB个人空间s o(u%V{~9o3D6`
  Level 1 BMB for Low HWM block: 0x0240001d
z U+_,[_[d2z0   --------------------------------------------------------ITPUB个人空间G(Ta1S1X
  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0      
KNIQ'FL"g2X H0   L2 Array start offset:  0x00001434ITPUB个人空间h%prqQ8?vKb
  First Level 3 BMB:  0x00000000
,|r,N/IAs0   L2 Hint for inserts:  0x0240000aITPUB个人空间&? Ui#W-qc
  Last Level 1 BMB:  0x0240001dITPUB个人空间:`"u_e@
  Last Level II BMB:  0x0240000a
)sD}s6Y0   Last Level III BMB:  0x00000000
)Z1v"l7]t#?-n0      Map Header:: next  0x00000000  #extents: 5    obj#: 52176  flag: 0x10000000
$bS)J$E Ypz0   Inc # 0
Z m"M6Z;N0   Extent Map
Nfji$BNJ.Nr,d0   -----------------------------------------------------------------ITPUB个人空间t0^1H M{;q:e1y%P;f
   0x02400009  length: 5     ITPUB个人空间-~,Y7`$|gO%rO"FX
   0x0240000e  length: 5     ITPUB个人空间;~3?_ f!s Nsci
   0x02400018  length: 5     ITPUB个人空间_d"A7M&sL2Z
   0x0240001d  length: 5     
w/X SZ a:C0    0x02400022  length: 5     
.e)w`3\} G0   ITPUB个人空间3l V5{] [
  Auxillary MapITPUB个人空间 {[2E6[m V!pz
  --------------------------------------------------------
Bm t5t8u}%X(S o@'[g0    Extent 0     :  L1 dba:  0x02400009 Data dba:  0x0240000cITPUB个人空间QLR6VWoU `Y
   Extent 1     :  L1 dba:  0x02400009 Data dba:  0x0240000e
m4xx2C$[^0    Extent 2     :  L1 dba:  0x02400009 Data dba:  0x02400018
0mw3@A$A0    Extent 3     :  L1 dba:  0x0240001d Data dba:  0x0240001eITPUB个人空间9b1Mr&fW [-X1p8dI
   Extent 4     :  L1 dba:  0x0240001d Data dba:  0x02400022
*?#B%Uo;uk9_)tb5D)M0   --------------------------------------------------------
c0~'`4VN|0   ITPUB个人空间 G M }Z&] Y/e
   Second Level Bitmap block DBAs
[+PW)y'\|M`mi-[0    --------------------------------------------------------ITPUB个人空间[r!Wt,ov(C|!Xc#J
   DBA 1:   0x0240000aITPUB个人空间AK6B&a.K i:W["g"S
  ITPUB个人空间W2Q'iW%p7Q[K&c
End dump data blocks tsn: 11 file#: 9 minblk 11 maxblk 11
%N} ~'@ _C2T ~R2F}0 ITPUB个人空间p kYFM,B q
查看上面的信息,可知现在表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个人空间r-Aq+FR8JF0q
步3:转储L2块9号文件10号块:
S+BA,hq,e&X*yr(?W0 SQL> alter system dump datafile 9 block 10;
"|6Gt3{7c\waI;i0 系统已更改。ITPUB个人空间tF2M@_,fm
*** 2008-02-15 13:52:03.359
/U1`1TB%H4q)M G(F*W0 Start dump data blocks tsn: 11 file#: 9 minblk 10 maxblk 10ITPUB个人空间)e]#YB;G*C:Cs
buffer tsn: 11 rdba: 0x0240000a (9/10)
hYzAe0 scn: 0x0000.001e0767 seq: 0x01 flg: 0x04 tail: 0x07672101
2F$s(?4y%wG0 frmt: 0x02 chkval: 0x4cfb type: 0x21=SECOND LEVEL BITMAP BLOCKITPUB个人空间^L*sA[b

"e$ZxZ(v0 Dump of Second Level Bitmap Block
R2FO0z%Xs0    number: 2       nfree: 1       ffree: 1      pdba:     0x0240000b ITPUB个人空间2v%n(`$z"w`$l Z&W
   Inc #: 0 Objd: 52176
4l(l U8NE uq_J*Z&h0   opcode:0
*R4r0uk J8ni0 xid: ITPUB个人空间~ r/y^7\
  L1 Ranges :ITPUB个人空间(L`'B&` wY\
  --------------------------------------------------------
t3im meo4g:o0    0x02400009  Free: 1 Inst: 1
$C$o Q5p*q:X0    0x0240001d  Free: 3 Inst: 1
5k%U S O3f:r.|0   
[#v-e'dY0   --------------------------------------------------------
/`&Lx h*q8r4A{j0 End dump data blocks tsn: 11 file#: 9 minblk 10 maxblk 10
5t^3J vL$v Q0 这里我们看到 L2块中有两个L1块 分别是 9号块 和 29号块,到这一步,Oracle如何在L2中选择L1?为了提高插入的并行度,这里将根据完成插入操作服务器进程的PID,计算出一个Hash值,根据此Hash值在多个L1中选择一个。也就是在多个L1中根据进程PID随机选择一个。此处要注意的是,高高水点(不是输入错误,高水点在ASSM中有两个:低高水点和高高水点)之后的块不在选择范围内。
9mAMV k~ml4@nc0 如果从两个会话中插入,Oracle会尽量将这两个进程分配到两个L1块中。ITPUB个人空间6E3^S-w)uLEA
        假设,这里选择了29号,我们再来转储它。
NUP0bRHrE0Y0 步4:ITPUB个人空间W3[J5xy)\
SQL> alter system dump datafile 9 block 29;
y)}E'q6IH3av0 系统已更改。
uN*[/u Td6Sy0 *** 2008-02-15 14:00:26.078
.r9`8~%SN B fl{f$a0 Start dump data blocks tsn: 11 file#: 9 minblk 29 maxblk 29ITPUB个人空间n+?;W2i @$\ y
buffer tsn: 11 rdba: 0x0240001d (9/29)
up1{d l,\TB F b0 scn: 0x0000.001e0767 seq: 0x0c flg: 0x04 tail: 0x0767200c
[_`1{&U)}0 frmt: 0x02 chkval: 0x4faa type: 0x20=FIRST LEVEL BITMAP BLOCK
eVT9T RR4H0 Dump of First Level Bitmap Block
NMHI h&`0 --------------------------------ITPUB个人空间Y `G%J i!A4aU
   nbits : 4 nranges: 2         parent dba:  0x0240000a   poffset: 1     ITPUB个人空间u7i4NDa%gZ7s
   unformatted: 0       total: 10        first useful block: 1      
8|wc8@7oE0    owning instance : 1
f&Yg,u4Q;O:K D0    instance ownership changed at 02/15/2008 12:01:34ITPUB个人空间{C*SL b'k5HN9V%d
   Last successful Search 02/15/2008 12:01:34ITPUB个人空间y-h-f3j2Y;\gKc
   Freeness Status:  nf1 0      nf2 1      nf3 0      nf4 0      ITPUB个人空间EStr,xy8q+C9E

Kr\?sa1]U0    Extent Map Block Offset: 4294967295
~vp5q|K0   First free datablock : 5      ITPUB个人空间s6R+?cK-aQ
   Bitmap block lock opcode 0
`+N$D _J9nqY2Y0    Locker xid:     :  0x0000.000.00000000
{G6moI4Q${0    Inc #: 0 Objd: 52176 ITPUB个人空间 g'G/l)m?
  HWM Flag: HWM SetITPUB个人空间'}8uyIQ {5{ZJ
      Highwater::  0x02400027  ext#: 4      blk#: 5      ext size: 5     
.y6}n'_+S*u6V3f S0   #blocks in seg. hdr's freelists: 0     
,D?f]9f0   #blocks below: 21    ITPUB个人空间gC/DqCub
  mapblk  0x00000000  offset: 4     ITPUB个人空间#\ujz;~ `
  --------------------------------------------------------
O]&A%\!Y'^2Z0   DBA Ranges :ITPUB个人空间x;?W{V(l+I t W
  --------------------------------------------------------
cUi t b ?M$c7Yc"Q^2N8H0    0x0240001d  Length: 5      Offset: 0      
3J-wBIx&Rv0    0x02400022  Length: 5      Offset: 5      
:_ `L-?/b2O oY0   
d-i~V R k R2r0    0:Metadata   1:FULL   2:FULL   3:FULLITPUB个人空间)h_B bB
   4:FULL   5:25-50% free   6:FULL   7:FULL
x,Vs*K\ |0    8:FULL   9:FULLITPUB个人空间b~"P3D&k/v'X6t
  --------------------------------------------------------ITPUB个人空间/I8gAnl4v@Q
End dump data blocks tsn: 11 file#: 9 minblk 29 maxblk 29ITPUB个人空间.H2\:| y&U
        此L1块中包含10个数据块,在这10个块中的选择,Oracle也是根据进程的PID,随机挑选。同样,两个不同进程发布的插入,Oracle会尽量使其插入进不同的数据块中,以提高并发性。

TAG:

晶晶小妹的个人空间 晶晶小妹 发布于2008-02-15 21:19:45
小妹第一次发贴,希望各位前辈多多指教!提出错误,让我进步^_^!
Oracle Life eygle 发布于2008-02-15 21:34:36
支持,初次发贴起点高啊!
zhaolinjnu发布于2008-02-15 21:40:59
Good
magic007的Oracle空间 magic007 发布于2008-02-15 21:45:52
支持
DBA 足迹 jimhou 发布于2008-02-15 22:03:38
Good
catchwo的个人空间 catchwo 发布于2008-02-15 22:16:49

idoi发布于2008-02-15 22:26:00
支持,不过自身水平有限,看的稀里糊涂,向你学习
kingsun631的个人空间 kingsun631 发布于2008-02-15 22:31:17
支持!第一次发的帖子啊
NinGoo@Itpub NinGoo 发布于2008-02-15 22:32:36
楼上的都在PMP,鉴定完毕
DBA 足迹 jimhou 发布于2008-02-15 22:51:07
自己水平比较低,好像没有看出auto与manual之间的区别。
stronghearted的个人空间 stronghearted 发布于2008-02-15 22:57:45
第一次发贴,就dump了。
["p$r3qd]w2\8y记得我第一次发贴,DBCA建库没有图形界面出现。space.itpub.net&J {OX-c5ER"D p L

9mBVBd|&h^ITPUB个人空间wonderful!
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-15 22:59:10

QUOTE:

原帖由 jimhou 于 2008-2-15 22:51 发表
9pf1r3j N(n#WV^space.itpub.net自己水平比较低,好像没有看出auto与manual之间的区别。
?+e!M&pv.v c        G&|

.SS)k
]!xIV        {space.itpub.net
在手动段空间管理中,没有L3 L2 L1 块,插入时 可用块的查找过程通过Freelist链表实现.
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-15 23:00:59
多谢大家的支持!oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net1K0^V-At#{{
嘻嘻,得到eygle大师的夸奖,实在是受宠若惊.嘴巴列到耳朵后面咯.oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net(rIqi}'~6f.I
偶会继续努力滴,不辜负大家的支持.space.itpub.netb        @AjY(exY
将我这几年的学习笔记都发上来,大家一起研究^_^!
SingleLove的个人空间 SingleLove 发布于2008-02-16 10:07:09
想问问楼主哪里人,姓啥?
烟囱的个人空间 烟囱 发布于2008-02-16 12:06:58
哈哈,楼上的有想法了.......
u.d\3`5oqR'z6R b#i:Q
学习了.楼主真是厉害.等下拜读第二篇.
lsc800426的个人空间 lsc800426 发布于2008-02-16 12:13:27
厉害!!!
SingleLove的个人空间 SingleLove 发布于2008-02-16 12:23:30

QUOTE:

原帖由 烟囱 于 2008-2-16 12:06 发表
-@2Wm7J_;k)[0l哈哈,楼上的有想法了.......
bn(G0EG!]$\ Soracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netRR$@%VH8`w
学习了.楼主真是厉害.等下拜读第二篇.
rn0J,V?(uz不是。。看到楼主的名字我想到了我一朋友而已
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-16 12:44:50

QUOTE:

原帖由 SingleLove 于 2008-2-16 10:07 发表 ~S*p(K7Gw9B L F
想问问楼主哪里人,姓啥?
0@1b
cXr


/S @$e R5h*~0V}}
h-t.R}#@U!f*QB俺家是河南开封滴,历史古城哟~~姓张 论坛ID 是偶的真实姓名
SingleLove的个人空间 SingleLove 发布于2008-02-16 13:05:16

QUOTE:

原帖由 晶晶小妹 于 2008-2-16 12:44 发表
S
N
IN hZ

eZ] C
bITPUB个人空间
3X"F$J"@'f/U
{l"h0n        V'R
B3d

俺家是河南开封滴,历史古城哟~~姓张 论坛ID 是偶的真实姓名
$f,Ylzgj3rspace.itpub.net*G(i/q+X%? c5B0c
晶晶姑娘,幸会幸会!偶一朋友也叫晶晶来着。所以看着你的ID比较亲切
DBA 足迹 jimhou 发布于2008-02-16 13:17:25
你的试验环境是什么样的。我在试验时auto和manual的结果是一样的,不知道存在什么问题。
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-16 13:24:00

QUOTE:

原帖由 jimhou 于 2008-2-16 13:17 发表
C6Hq;l7J/i

你的试验环境是什么样的。我在试验时auto和manual的结果是一样的,不知道存在什么问题。
S
CY
C0\5] U9?

n4L$S-nz"_-p        Gr Za0h._
我在9i和10G下都做过实验,结果是类似的!ITPUB个人空间#K        bzn ZwGV
在LINUX和WIN下我也都试了,是一样的!ihOktO-Ud

~.DL!~sm7rk
{
你建立表空间的命令是什么?

\xN6|T1[4H;tK
我在10G中建立表空间的命令是: create tablespace new1 datafile 'e:\oracle\jjts\new01.dbf' size 10M extent management local uniform size 40K;&^CKW:]H K8Bp
如果在9i中 还要再加上 segment space management auto;
DBA 足迹 jimhou 发布于2008-02-16 13:40:41
和你的方法一样
shiri512003的个人空间 shiri512003 发布于2008-02-16 13:41:51
强帖!!
a0VDoaITPUB个人空间老乡呀~~~
&G/m5l8r1U}
F k
楼主现在在那边呢??
DBA 足迹 jimhou 发布于2008-02-16 13:45:26
我知道错在哪里了,谢谢。
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-16 13:49:17
楼上的不客气...
P6j}.lRng&Rj4NITPUB个人空间偶现在在家呢,正在总结以前的学习笔记,想和大家讨论一下.
.G.c9TI6p        {(_8Y'cITPUB个人空间等我整理的差不多后,准备出去找工作呢!
shiri512003的个人空间 shiri512003 发布于2008-02-16 13:55:22
上qq吗好不容易碰到个老乡
]!W4X'|9m8IITPUB个人空间搞数据库的space.itpub.net1tlL,i$L!k
水平还满高}vY#[-Y
希望结识呀
]X~'v-G+hmy qq:281613430
M,Q
z)\2il*U$t#g8i
欢迎加我~~~
DBA 足迹 jimhou 发布于2008-02-16 13:55:40
那你应该把简历直接给biti,估计可以免试了。
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-16 14:36:07

QUOTE:

原帖由 jimhou 于 2008-2-16 13:55 发表 oze;Cj/b|
那你应该把简历直接给biti,估计可以免试了。
x7[~*JTgVs

)X/UJ#K/\9o7I9^6zoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
;@!Z MT'M]3ioracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net哈哈,您太抬举我咯! 以前就是工作太忙了,现在想把自己的学习,工作经验好好总结总结.再出去工作!^_^!
lsc800426的个人空间 lsc800426 发布于2008-02-16 15:07:26
[quote]原帖由 晶晶小妹 于 2008-2-16 14:36 发表
{&m0Ue _MWx.M,z8T
a        w'tlqq

oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net5at7r+j^
}#T-`
Cam

        D-d-R,[:}|-z2B
哈哈,您太抬举我咯! 以前就是工作太忙了,现在想把自己的学习,工作经验好好总结总结.再出去工作!^_^! [/quote.Ol'W`"~w
[W/D)O


!S `&t)i?
V"V%AS!fFN,h
K
LZ不用自己找应该都有很多人找上门来的。呵呵
9Qb2g^ B,M[0u:XG+wY$@.O-T
对了想问你一个问题:p/N`@eOH
lob$表中主要存放sys和system用户下的一些表。3wcP#gI(T Q-E.w n
存放这些表主要的用途是什么呀?
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-16 15:34:57
回答楼上的:catalog.sql 创建数据库时自动运行的脚本,他创建了很多数据字典视图.
e QztL_Uoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net查询这个脚本可知,lob$和dba_lobs,dba_varrays相关联,是这两个视图的基本数据字典表之一,可知lob$表中的内容和lob对象,varray对象 相关.
我来说两句

(可选)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 105674
  • 日志数: 32
  • 图片数: 4
  • 建立时间: 2008-02-15
  • 更新时间: 2008-05-29

RSS订阅

Open Toolbar