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

晶晶实验二十二之 直接路径插入篇

上一篇 / 下一篇  2008-04-02 23:24:28 / 个人分类:晶晶oracle实验系列

查看( 625 ) / 评论( 16 )
一、直接路径插入与间接路径插入的不同
UU3G?M3H0     这个问题相信很多人都已经知道了,为了方便初学者,我再来重审一遍。
NM7L9ZC5a#I {Xq0 create table 表1 as select 列1,列2,... select 表2
8h E4ZVG*^,@!C5aS3q0 insert /*+append*/ into 表1 select 列1,列2,... select 表2
&x6e\yb,{D8kO0     如上形式的插入,都叫做直接路径插入。当然,在SQL*Loader中也有直接路径插入的形式。ITPUB个人空间;^]cpG9[h!H
    所谓直接路径插入,就是绕过Buffer cache,直接将数据插入进表所在数据文件中。ITPUB个人空间G4vG.|%WD n`
    假如有表AA,要将AA中的数据插入进表BB,在普通的间接插入下,先将AA的数据块传进Buffer cache,再将BB的块也传进Buffer cache,在Buffer cache中从AA的块中读出行,插入进BB的块中。BB的块就都变成了脏块,再等待DBWn把它们写进数据文件。因此,间接路径插入后,AA表的块和BB表的块都会在Buffer cache中出现。ITPUB个人空间;sjfR RQqN
    而直接路径插入下,将AA表的数据块传进Buffer cache中,读出行,直接写进BB表所在的数据文件。插入完毕后,除了表头块外,BB表的数据块并不会出现在Buffer cache中。
q"`.|FG v_ M q0     下面来试验一下:ITPUB个人空间7r F#z(Y"F\2mv
步1:准备试验用表:
B-wAM~4X7uX-`0 SQL> create table aa(id number(4),name varchar2(5));
iq!e'COl&yjF%j {0 表已创建。
d}6?W#Yn6P8tO)W0 SQL> create table bb(id number(4),name varchar2(5));ITPUB个人空间n6XPAF7p+p
表已创建。
J$\1XsJ+h:b0 SQL> insert into aa values(1,'aa');
(WE|*ZC0 已创建 1 行。
2]x%KR6~"glrd0 SQL> insert into aa values(2,'bb');ITPUB个人空间.`#M$H.qT6M3B
已创建 1 行。ITPUB个人空间;qz| i+Mk2NB
SQL> insert into aa values(3,'cc');ITPUB个人空间2_ Xblw` TN$a
已创建 1 行。
ulf^A0 SQL> insert into aa values(4,'dd');ITPUB个人空间*Z6KX0|7C F2[*\IL$e7h
已创建 1 行。
e!te+Fb9H#J4m-{y-u0 SQL> commit;ITPUB个人空间0hr{-B FMBc-L
提交完成。ITPUB个人空间;[ W*~ c0G%FZ{
SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from aa;
L$p9iCh2b0 DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
d _!X0~8i.Bs2s0 ------------------------------------ ------------------------------------ITPUB个人空间jR%a9Mn7N
                                   4                                18493
^3xV8vF$pYUvMF0                                    4                                18493ITPUB个人空间Yn R"s'Tv s
                                   4                                18493
Hq#NJ$z9q"fT&E0                                    4                                18493
KA$A+]7^uFLvF0     现在AA表中有4行,占用块18493。BB表中没有数据。ITPUB个人空间8|Cn O g,b)wS"D
步2:将buffer cache清空,我这里使用重启数据库的方法:ITPUB个人空间2Z\4u@z9o%^
SQL> shutdown immediateITPUB个人空间 j#R(aaI SH2S?
SQL> startup
w:m:EYv~0 步3:先用直接路径插入,从AA表向BB表插入数据:ITPUB个人空间(H|H8_ nY K+s7N
SQL> insert /*+ append*/ into bb select * from aa;
;l#OX"}5P0 已创建4行。ITPUB个人空间+JW3e T&I1HZNI
SQL> commit;
0lvM#@[(NP,x0 提交完成。ITPUB个人空间uzfR ox |@6u`-q
步4:使用V$bh查看Buffer cache中的块:
)V P8wxZ7`B `(w0 SQL> select file#,block# from v$bh where objd=(select object_id from user_objects where object_name='AA');
b$x8r_~#UanU8Rrv0      FILE#     BLOCK#
/c^$mv!X'cU0 ---------- ----------ITPUB个人空间zSS!Z2m o*Z
         4      18491ITPUB个人空间.W TYkS+t,t:H
         4      18491ITPUB个人空间MMm^ R
         4      18494ITPUB个人空间$psL(r(_ ?$\yt
         4      18492
"L)jO \d)S ifQ0          4      18495
CS1~e_\m.H|lG0          4      18493  <---- 当前包含数据的块ITPUB个人空间i$GX` \lU j'Vj
         4      18496
{0?Q5w-rrT-K0 已选择7行。
G{Fo"]l}QX0 由于对AA表进行了全表扫描,因此,AA表中高水点下的所有块都被读进了Buffer cache,这其中当然包括包含数据的块18493。ITPUB个人空间"AoWb*\}$S
SQL> select file#,block# from v$bh where objd=(select object_id from user_objects where object_name='BB');ITPUB个人空间 Wvg*]!\1}0s)U
     FILE#     BLOCK#ITPUB个人空间0q:HDszh#{(mS
---------- ----------ITPUB个人空间IJV&axC
         4      18499
.~-f8JRiRT0          4      18499
bf`&Ozy0          4      18497
c7fH$]Ha,Gq7m?3y8B0 SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from bb;ITPUB个人空间,[ Xk+dE9C _
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)ITPUB个人空间|;T#S#D.k$_
------------------------------------ ------------------------------------
DCo2zZn+p$[0                                    4                                18500ITPUB个人空间C'ZHrPSWUd"@!E
                                   4                                18500
7iB9?#us0                                    4                                18500
~Qk)os0                                    4                                18500ITPUB个人空间fO [5T|{L
    上面两个查询可以看到,BB表中的数据占用第18500块,但是,直接路径插入后,18500块并没被调进Buffer cache。Buffer cache中只有18499和18497。 其中18499是段头块,而18497是L1块,直接路径插入后,要修改L1块中的数据块使用情况。ITPUB个人空间]-F5b!o9u
步5:再试一次间接路径插入:ITPUB个人空间lX8|D+\2M8W
SQL> insert into bb select * from aa;ITPUB个人空间5GX/czn6\
已创建4行。ITPUB个人空间-KCi'eVL
SQL> commit;
M%`)t$p2TEu2?0 提交完成。
l6Gs NWKY0 SQL> select file#,block# from v$bh where objd=(select object_id from user_objects where object_name='BB');
@u!]`?n5t0      FILE#     BLOCK#
f+e)d4s j+S_+D0 ---------- ----------
6QUS/j|M3qX0          4      18504   <---- 本次间接路径插入的数据所在块ITPUB个人空间&NI^V k$`/b
         4      18499ITPUB个人空间 E!Uv(R[ |.C'@3m
         4      18499
o$s GCG3BN U0          4      18502ITPUB个人空间` s)G9?^ uDc
         4      18497
yt5Z r#zx f0          4      18500ITPUB个人空间E0P,BKi
         4      18503ITPUB个人空间C(I;P'AG"d9?m
         4      18498ITPUB个人空间A9_t\(|
         4      18501ITPUB个人空间 Q+g"k @+yT4^$p7A;I(~
已选择9行。
.[j/RB.JZ Z O0 SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from bb;ITPUB个人空间VEM9BYEp+I%F,P
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
2i&t&c0Ue k0 ------------------------------------ ------------------------------------ITPUB个人空间lN/d:z)r5W%G$_:S
                                   4                                18500ITPUB个人空间$h2K'q @P bGr
                                   4                                18500
&W e'u[C0                                    4                                18500ITPUB个人空间Ai4~$VZ*T.P5I
                                   4                                18500
%s)lT j lP @Yz0                                    4                                18504
6B`7P7tK([9M0                                    4                                18504ITPUB个人空间F?knH.g| _
                                   4                                18504ITPUB个人空间AEE(i{?
                                   4                                18504
R'?%K B#d |\W p0 已选择8行。ITPUB个人空间^4p5{2S6~(p'O6M
    从上面的实验可以证明,间接路径插入,要先将数据块传进Buffer cache。这是Oracle通常修改数据的方式,不对数据文件直接进行修改,而是在内存中完成修改,再由日志提供保护。对于小量数据的修改,这种方法的性能还是很不错的。但是大量数据的修改,直接路径插入将可以提供更好的性能。ITPUB个人空间?#guf s@D"],C$na
    直接路径插入除去少了将BB表的块传进Buffer cache这一步外,它还不产生回滚信息,下面来进一步的实验:ITPUB个人空间3u K!Lp,xn6Ys1^A
二、直接路径插入与回滚:ITPUB个人空间$bO9m#PI0S-u-Hr
步1:再次向BB中直接路径插入:
(l?QBO0 SQL> insert /*+ append*/ into bb select id+4,name from aa;ITPUB个人空间k'H+W1` a/p!LpoPx
步2:查看事务信息:ITPUB个人空间2n Sr%F%dU)e!N4f
SQL> select xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn from v$transaction;
!e)g%d-t v-Q1CG1b0     XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN
\sb lG4J-J0 ---------- ---------- ---------- ---------- ---------- ----------
hdft0m m0         11         23        854          0          0          0
j!v|J*_Y t%Z0     因为当前只有一个事务,因此选择 v$transaction 视图时没有加条件。从上面的显示结果可以看到,UBAFIL、UBABLK为0。也就是此事务并没有对应的回滚块,只在回滚段头的事务表中占用了一行而已。ITPUB个人空间-};~*egk9l
    直接路径插入是如何提供回滚的呢?观察BB表高水点的变化,就可以解答这个问题:ITPUB个人空间8lzLm^N*vma%D
步3: 查找BB表的高水点:
\Va*D6L;{ q0 SQL> select header_file,header_block from dba_segments where segment_name='BB';
G5P&N zn Ie3h yW0 HEADER_FILE HEADER_BLOCK
!hkP3?0v.q0 ----------- ------------
_/EQR'[0           4        18499
Q.z I1wr,T"s0 SQL> alter system dump datafile 4 block 18499;
(M9u1t mw;K%i0 系统已更改。
Z)y7f"z0?$mG `o'X2b0 查找转储文件:ITPUB个人空间y5rR#T/`g
  Extent Control HeaderITPUB个人空间jt!bq-r-G/v5].O
  -----------------------------------------------------------------ITPUB个人空间 _V+X3DIn4P
  Extent Header:: spare1: 0      spare2: 0      #extents: 2      #blocks: 16   
T-n k'}%s EC0K)W(G-@0                   last map  0x00000000  #maps: 0      offset: 2716  
%|~(DoW,C0       Highwater::  0x01004849(高水点)  ext#: 0      blk#: 8      ext size: 8     ITPUB个人空间:exK7_wH
高水点是4号文件18505块。ITPUB个人空间`sg@%Lr2c2Q
步4:提交后查看直接路径插入到哪个块中:
S6Ra(N,F1XL(dP0 SQL> commit;ITPUB个人空间1zw._ WMu6s-w)c
SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from bb where id>=5;
3j1P-yT5M'\:O C0 DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)ITPUB个人空间"{at^L [7}e
------------------------------------ ------------------------------------ITPUB个人空间U6O(@a} TI#o"a
                                   4                                18505ITPUB个人空间Q+|6A/J6faV?%d
                                   4                                18505
+i\ ? c0d%Z2e0                                    4                                18505ITPUB个人空间O^(}/[y"l;dp,`
                                   4                                18505ITPUB个人空间7Mm PpXIL$W3?
本次插入的数据ID列值为5、6、7、8,通过上面的查询,本次直接路径插入,数据被存进18505号块。而提交前的高水点正是18505。
P h ^5\ {%z'Tr0 |--------------|--------|--------|----------
8ul&?9y9w c3B*tV0 |数据块 ...... |18503|18504|18505ITPUB个人空间U$]Ov)P
|--------------|--------|--------|----------ITPUB个人空间!D'n\ X'b0e9`{
                                               ^ITPUB个人空间N4fa4Py6ya/Yu A
                                                |ITPUB个人空间;v}T$i#\Kb!T
                                                |ITPUB个人空间 |#E*r6|ZLI
         此处是高水点,直接路径插入从此块开始分配空间ITPUB个人空间&tJ!KV(rqOA8f
直接路径插入,是在高水点之上分配临时段,将数据插入时进此临时段中。在提交后将高水点提升至临时段之上。
SvaJUT0 现在已经提交,再查看高水点信息:ITPUB个人空间J:zq2tWu
SQL> alter system dump datafile 4 block 18499;ITPUB个人空间w!s"O.O5jc9L(Kd
系统已更改。
9J:iO*dei0   Extent Control HeaderITPUB个人空间A/z-^ }T8?!h}A
  -----------------------------------------------------------------ITPUB个人空间-b:vBh*{ d
  Extent Header:: spare1: 0      spare2: 0      #extents: 2      #blocks: 16    ITPUB个人空间5L$m p6ug!JQ
                  last map  0x00000000  #maps: 0      offset: 2716  
4N} P{,q%Lnd3n il0       Highwater::  0x0100484a(刚才是4849)  ext#: 1      blk#: 1      ext size: 8     
3R.D%olT_7H { K0 高水点升至18506块,如下图:
IP`6]-~*B){W?0 |--------------|--------|--------|--------|-----ITPUB个人空间.b3i$q3K;D$\{
|数据块 ...... |18503|18504|18505|18506
9I)a)u$T@K;zA0 |--------------|--------|--------|--------|-----
'Tj$zs*@FG0P0                                                           ^
W5zfGDg0                                                            |
)?_w-d/}kf0                                                            |ITPUB个人空间+Z$?] fEbk
                                               高水点上升至此处
"XcLOI@_0 步5:再试一次直接路径插入回滚时的情况:
n ik4j#FfYQg0 SQL> insert /*+ append*/ into bb select id+8,name from aa;
5W!o!csXkY0 已创建4行。
8o}p&V#|V0 猜想一下,此次插入应该插入进18506,如果提交的话,就提升高水点到18507,如果回滚的话,保持高水点不变。ITPUB个人空间 @!gHYF+{9ehs
查看高水点,当前仍是18506:
vJ)\%s:L0v4E0 SQL> alter system dump datafile 4 block 18499;ITPUB个人空间z+r}fgIqr&~
系统已更改。
T-}7].f9qf0   Extent Control HeaderITPUB个人空间"t)t/Wd$|-E3Cp
  -----------------------------------------------------------------ITPUB个人空间 j-f [Ie i
  Extent Header:: spare1: 0      spare2: 0      #extents: 2      #blocks: 16    ITPUB个人空间eO$p!oV]S6uH*?IH
                  last map  0x00000000  #maps: 0      offset: 2716  ITPUB个人空间a!B#Ro?j B
      Highwater::  0x0100484a  ext#: 1      blk#: 1      ext size: 8     ITPUB个人空间#W Z8[#r{%Zm;G
如果提交,肯定会变为18507,这个我们在步4已经被证明了,现在我们回滚:ITPUB个人空间4V&Gx'LN5k&_e$l-k
SQL> rollback;ITPUB个人空间&k#{ C+Y}N!H
回退已完成。ITPUB个人空间e G)J(]x0C+Vv
现在已经回滚,查看高水点信息:
3V,JR P]L5r A(Kz(P0 SQL> alter system dump datafile 4 block 18499;
%\E/iM,M Ogst6w0 系统已更改。ITPUB个人空间-I^k2m0eg
  Extent Control Header
)Wop;Q_ s!H&C#x0   -----------------------------------------------------------------
n/^[@!j5W\0   Extent Header:: spare1: 0      spare2: 0      #extents: 2      #blocks: 16   
4I8y|4J;a+`9{0                   last map  0x00000000  #maps: 0      offset: 2716  
#CR.LVN0       Highwater::  0x0100484a  ext#: 1      blk#: 1      ext size: 8     
Pl.@f"G5h0v,o1D0 仍是18506。
iD*YJ,|+u0 也就是说:ITPUB个人空间 n!Tu K$FK i
|--------------|--------|--------|--------|--------|------
|ff"UZktJ*I0L0 |数据块 ...... |18503|18504|18505|18506|18507ITPUB个人空间nkV4DC8A'o
|--------------|--------|--------|--------|--------|-----
,@N.dCw*q#B0                                                         ^ITPUB个人空间G&@f*{!g,Ud6D/MD
                                                         | ITPUB个人空间Qw/zI7L\p1Hk^
                                                         |
Ya3b+kWl0                                                    高水点在此处
@?*w[B S z0                                                  数据插入至此处ITPUB个人空间 Jzm-x0`j5E+MN}f1b7g
提交后,高水点升至18507,而如果回滚的话,高水点不变:ITPUB个人空间? W t*P D&n3E2nc
|--------------|--------|--------|--------|--------|------
_QL1aa3c HR0 |数据块 ...... |18503|18504|18505|18506|18507ITPUB个人空间HFt-|yR$lT w
|--------------|--------|--------|--------|--------|------
2u9x8aJx W8_K bg0                                                           ^
0S.P\-G8mvG0                                                            |
Wl3QE,m^ e Y0                                                            | ITPUB个人空间&Nlc&l)G` qs^
                                            回滚后高水点仍在此处ITPUB个人空间!U DjHi$}Tm

(Qi7{I2O[;u0 三、直接路径插入与索引
%w9T&W/k*_He&t2j0 直接路径插入时,不产生表块的回滚信息,依赖高水点实现回滚。但时,如果表有索引,将会产生索引的回滚信息,而且索引的块会被读时Buffer cache。也就是说,数据不能“直接插入”进索引。下面实验一下:ITPUB个人空间2T(aq3Qz3I&D\
步1:为表BB创建一个索引:ITPUB个人空间 GbTXh}'H
SQL> create index bb_id on bb(id);ITPUB个人空间_ zL$PW5Mg
SQL> select file#,block# from v$bh where objd=(select object_id from user_objects where object_name='BB_ID');ITPUB个人空间q RX4k+v v:X
     FILE#     BLOCK#ITPUB个人空间f^f"}'hP V'L
---------- ----------
;[3N%V4vi7n0          4      18515  <--- 段头
t CY k`3J Z0          4      18513  <--- L1块
wDQ5q ?~0          4      18516  <--- 第一个索引数据块ITPUB个人空间 ~5R%oN,v[#N
         4      18514  <--- L2块ITPUB个人空间Y5]t(?YW1?7w
重启数据库,清空Buffer cacheITPUB个人空间$K*A+Q+K*M?
步2:ITPUB个人空间KE L/G4V;V?RE3sT
SQL> insert /*+ append*/ into bb select * from aa;
J)i }V!AL.g'q0 已创建4行。ITPUB个人空间}Zd4`g)U&Z
步3:
E"j$e$ZS#^'xQ!@0 SQL> select file#,block# from v$bh where objd=(select object_id from user_objects where object_name='BB_ID');
a k M(e F` |0      FILE#     BLOCK#ITPUB个人空间"D4pvX!A#qU,]Mq
---------- ----------
obm)dbO0          4      18516
%hP:w5{?\B8A0 直接路径插入时,索引块将会被调入Buffer cache。
6H9Fi/a ~$p.`O0 步4:
VtuI3V:W#k0 SQL> select xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn from v$transaction;ITPUB个人空间r_"h;r ] g ~2[9L
    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN
a-M!MKL(hs O0 ---------- ---------- ---------- ---------- ---------- ----------
&v[;ap,R'iS;gu0         12          9        548          5       2896        255
K$CsI2U0ZC6W$E(U7I0 并且,对于索引块的修改,将会产生回滚信息,回滚信息保存在回滚块2896处。ITPUB个人空间"MH%U6QRfu6L
因此,索引并不会“直接路径插入”,因此,插入的索引数据,应该是在高水点之下:
p*j)h$QC7B0 SQL> select header_file,header_block from dba_segments where segment_name='BB_ID';ITPUB个人空间\\ F8mQ.Qm5wfF
HEADER_FILE HEADER_BLOCKITPUB个人空间 jX#V2Vg;f(XH1x
----------- ------------
^${ pg|,~,Kq&W0           4        18515
hWnP-M0 SQL> alter system dump datafile 4 block 18515;
t Oy6E}S0W0 系统已更改。ITPUB个人空间q*p,J)l}7Nd
  Extent Control Header
1?6lqbf cR#`0   -----------------------------------------------------------------
e2a ~2?4zm0QT0   Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8     ITPUB个人空间4Y }4~ A'~ \2Cv T
                  last map  0x00000000  #maps: 0      offset: 2716  
kmJjBgF3|0       Highwater::  0x01004855(高水点)  ext#: 0      blk#: 4      ext size: 8     
Y2D{ S1G*C8@T"R)q0 高水点在18517处。插入的索引数据在18515处,在高水点之下。
.[2K$d%Q4JJt0 在文档中也曾建议,如果使用直接路径插入,向表中传送大量数据,可以先将表上的索引删掉,插入结束后,再重新建立索引。

TAG:

netbanker的个人空间 netbanker 发布于2008-04-03 08:09:58
sofa
Oracle的琐碎生活 yuxuan 发布于2008-04-03 09:56:22
学习
春暖花开 tolywang 发布于2008-04-03 10:39:14
因此,索引并不会“直接路径插入”,因此,插入的索引数据,应该是在高水点之下:,`} {-p7]K1c
YMJy1@-m
........oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.nett"t,\0zh(y,c

rVY"K-XJe(C+VpT+mRV
高水点在18517处。插入的索引数据在18515处,在高水点之下。
M b^&H6l:_2^e
0Y.pm2l!j:XITPUB个人空间
kq8e
| e8{A;Aoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
-------------------
.M?/aZU,Qsspace.itpub.netspace.itpub.net#i
E6k} NU&O|


_^lwAxb
@4s6sC6U)Xoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netappend 数据不需要经过buffer cache , , 直接在hwm以上insert 到数据文件 , 不产生undo信息 , 利用hwm回滚,回滚后hwm不回退
p#J$C'xFE9z(Z-oybCX
append 索引需要经过buffer cache, 但是是写入hwm之下的部分
ag
Hc!E
h!mK


g4s?0_ZBt
这里    “ 索引并不会“直接路径插入  ”  ,而是通过buffer cache,能说明 索引数据(新插入的数据index)在高水点之下, 有些不明白, hwm之下有空间来插入这些新的大量的index数据 ,还是....... ?
feng_xin的个人空间 feng_xin 发布于2008-04-03 11:04:20

louis_xu的个人空间 louis_xu 发布于2008-04-03 11:58:24

Yong Huang的个人空间 Yong Huang 发布于2008-04-03 12:13:20
Great posting! I'm learning from your posting.mRS!X-j
e)g8UW        SX
Some minor comments. v$bh.objd is better matched against data_object_id. Some operations can change it to a value higher than object_id.
,V&AV%^l)~aioracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
#Xg,ZIM(f
x)[
将buffer cache清空, why not alter system flush buffer cache (or ALTER SESSION SET EVENTS 'immediate trace name flush_cache' in 9i). I remember somebody posted a test that seems to show bouncing the database could actually pre-load some block buffers and manually flushing it removes this artifact. But I never chased down the root cause.
l4^pA1Yboracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netITPUB个人空间%T#Yk]&K2M-Pa0~
If you really want to avoid going through buffer cache even for the select part (which does a full table scan), you can alter session set "_serial_direct_read"=true before the insert select.\} dv2@:r
p!R+|


9@ h*CJi,c[ HI've never tested but can you test setting _idl_conventional_index_maintenance to false and see if the index can also behave the same way as the table in direct path insert? (I don't have access to a database right now.)o"c Y3D,M9EV"N

?B(M%U^ R%Qtspace.itpub.netYong Huang
晶晶小妹的个人空间 晶晶小妹 发布于2008-04-03 14:15:13

QUOTE:

原帖由 Yong Huang 于 2008-4-3 12:13 发表
p"[%w\J2[i
|
Great posting! I'm learning from your posting.space.itpub.net8_t^|&Hb oK        |

I5O f8t'Q*y7f]Yk&r#fSome minor comments. v$bh.objd is better matched against data_object_id. Some operations can change it to a value higher than object_id.space.itpub.netz!pdMyF8f"p*q N5c$A

gyk
y$i5f7U~
将buffer cache清空, why not alter system flush buffer cache (or ALTER SESSION SET EVENTS 'immediate trace name flush_cache' in 9i). I remember somebody posted a test that seems to show bouncing the database could actually pre-load some block buffers and manually flushing it removes this artifact. But I never chased down the root cause.space.itpub.netd,]0r/eF'|4q        ?{_
.e4j@(X5VYD3K
If you really want to avoid going through buffer cache even for the select part (which does a full table scan), you can alter session set "_serial_direct_read"=true before the insert select.space.itpub.net%}JH\R0B@:B
space.itpub.netWzV7] p)vn)n
I've never tested but can you test setting _idl_conventional_index_maintenance to false and see if the index can also behave the same way as the table in direct path insert? (I don't have access to a database right now.)
s&O?0E        gblDwRd+H@t2XP
Yong Huang
        W.xL9i&l"h9f

)G8J)JV$\j-i关于 v$bh.objd ,你说的对,与data_object_id关联的确好一点。马上修改一下。我记得通常截断表后object_id会发生变化。oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net        Hr(Q[A.B Xc6v
这两个隐藏参数的作用,_serial_direct_read、_idl_conventional_index_maintenance,我是第一次听说,晚上试验一上。谢谢你告诉我有这两个参数。
M0E#Xi        C#h2MN'g+`G"Goracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
C)RO3vh.Ojt4vspace.itpub.net只所以没有使用 alter system flush buffer cache , 我记得在以前的一次试验中,alter system flush buffer cache 只清除了部分块,而有许多块只是把LRU_FLAG状态(在X$BH中)设为4(在辅助LRU链中),TCH清零。Gr.} e
Eao

下面试验一下:
zt2bSaWf步1:全表扫描BB:
{P`v#KaWspace.itpub.netSQL> select * from bb;
)^CQ`0`"Wmxjoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net        ID NAMEspace.itpub.netK
KB'mI2L%q&C

---------- -----@Xv??2RX:n
         1 aa4{M#b
oN6t Z

         2 bbN4wRXgRah1S)l
         3 cc
8w#f/h7Y)YrITPUB个人空间         4 dd
+I:n(I*v t,eoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net         1 aa
F0T0z Q`&{
g
         2 bb'QsY
I0N/~mj"ve6z

         3 ccoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
D@-m"W(]4[;n6y

         4 ddspace.itpub.nety
Lc!?!g6G5s

         1 aa
t5cZ        D0rj         2 bb
'O'@VT{(u         3 cc
h^
j7d1T W0I C&\
        ID NAME
w/dw:~\&`(aA---------- -----
5Gb!t2pM.n'Y3L         4 dd$fY3E^C
         1 aa{e9H.e7{
         2 bb,F"R+h U,h
         3 cc
sGe2]AKY:V4O;CbE         4 dd
!kB/@{\cb#wQITPUB个人空间         1 aaspace.itpub.net g;t5o0b R
         2 bb
N1@ouE}"g f4^'s"Espace.itpub.net         3 ccspace.itpub.netN0qOvG.w,{
         4 dd
(p_^J        [Y0Uspace.itpub.net已选择20行。"Dd T!EM k-aV2l.{
0^t?#@3zX
步2:查看Buffer cache中BB的块有哪些:oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net lFj4DC$w Dr(U
SQL> select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='BB');
oZ&J!Cv2J)_Q     FILE#     BLOCK#
,W6O'_6f k*k!LV(Fspace.itpub.net---------- ----------
RD5@Bpa%b4p]space.itpub.net         4      18504-^|*E6cN'O$n
         4      18499'}~:xW*Wp
         4      18507space.itpub.net
^X'o G7Iv"s

         4      18502rQe(cg'f9V
         4      18497
#EO_1A~L'{         4      18505ITPUB个人空间9cd*X5X^j@Q
         4      18500space.itpub.net9mB2A'A^K
         4      18503
'mLEw
W\A+{~"A
         4      18498ITPUB个人空间#t F:`"_x
         4      18506|["Oz\!zjvH
         4      18501
/M2Q;fZO)[已选择11行。space.itpub.net-Bp&hSC1RtvT

jSc7iqrGITPUB个人空间步3:刷新Buffer cache
$|Si n"NZVajjSQL> alter system flush buffer_cache;;]%KKnYx
系统已更改。ITPUB个人空间.x
W
I$l
t,r0J Q


h)Z,P1]P        zrDyqa0g步4:再次查看Buffer cache中BB的块有哪些
@q7VU3s.goracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netSQL> select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='BB');
7]$~^f9A4jZg i     FILE#     BLOCK#
k"b a:s1[space.itpub.net---------- ----------#L \E
B?c9k

         4      18504
1L$lG1qWPspace.itpub.net         4      18499space.itpub.nethN{-f(DPB
         4      18507
(bS:H] B(g"\WK         4      18502oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netA5n.I(iA Ac
         4      18497ITPUB个人空间7Y6{,wv%{
         4      18505
7i3Sql#v#m-Bg+^         4      18500
E[pjmv&w         4      18503"P*CP        BTi#]#S
         4      18498ITPUB个人空间G s-{+F_:v&S-I
         4      18506
;]
l/U1O#@space.itpub.net
         4      185013H#M0O6h;TK
已选择11行。
*Q(@~$Jf/S4V^y~Yd A8xkb0wT
可以看到并没有少。不过现在Buffer cache中,所有的块的TCH都是0,LRU_FLAG状态都是4(说明块在辅助LRU链表),马上可以被覆盖。再次运行一遍步4的查询:
1K"w?Oj{4mS%m
fzi#x1R$\SQL> select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='BB');
9bV3e5@!y%V     FILE#     BLOCK#w6FS*S){a
---------- ----------space.itpub.net_"[E1n'S?"d
         4      18504
"p s'v-e6D5fITPUB个人空间         4      18502ITPUB个人空间;d7aq|ujh7s$[H
         4      18505oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net5o3YP4[v#V.z
         4      18500
:~2M6ggW&J,toracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net         4      18503Q8C_ n V
         4      18498
] MMGz2S8L8S,CDspace.itpub.net         4      18506
9fdlZ3O         4      18501
$W!b&Vw*xV
J
已选择8行。
@;{&|8]Ku3dC
4Gs:j%x`j:I O.K/_ITPUB个人空间只剩下8个了,比刚才少三个。&p'Z+KqgaL
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net        em
{8E7d$pQ

显示X$BH可以看到:oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netX%Pm?}*Yx
SQL> select file#,dbablk,tch,lru_flag from x$bh where obj=(select data_object_id from dba_objects where object_name='BB' and owner='QSMED');
!^
Ssp3n#n{ITPUB个人空间
     FILE#     DBABLK        TCH   LRU_FLAGspace.itpub.net&i
vRvTAR,Us3_

---------- ---------- ---------- ----------
8wx R,T        fRQ         4      18501          0          4ITPUB个人空间!Hp M%eo
         4      18506          0          4
,HB tJ@b
K@ITPUB个人空间
         4      18498          0          4
,j],nj;k&{MkP(z(Xsspace.itpub.net         4      18503          0          4
o%\FzY2t1Hk5p         4      18500          0          4space.itpub.net CYk(tN\f&c
         4      18505          0          4ITPUB个人空间Tb        iMS2g?
         4      18502          0          4space.itpub.net7z asx"SR {9l
         4      18504          0          4
Qr5_a*uI8Aspace.itpub.net已选择8行。
"]$axW~5?]UFITPUB个人空间 \tLA#MvX
每个块的TCH都变为了0,LRU_FLAG为4。oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netP'D
m/c-pd:v

NT m2@9Age_
其实这时只需扫描一个大一点的表,这些LRU_FLAG为4的块就都会被清除或覆盖。不过重启动数据库命令简单些。
晶晶小妹的个人空间 晶晶小妹 发布于2008-04-03 14:20:12

QUOTE:

原帖由 tolywang 于 2008-4-3 10:39 发表
c$a#r ^hl1DITPUB个人空间因此,索引并不会“直接路径插入”,因此,插入的索引数据,应该是在高水点之下:
]2{0W I1['YNqITPUB个人空间;C7~-m0`!J
........space.itpub.netR*_ hu\&QAd/SA
space.itpub.netaRPZs?_O

.v4V}|Dwy高水点在18517处。插入的索引数据在18515处,在高水点之下。
7q7{#B`P
z'\7V
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.neth6m4Srnt+[
6a(Q b'H:v9r Z2@l        |I
------------------- oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net5Jy.r5T
\+ji


'}-?"cv4P kITPUB个人空间;m}(z3R?-[,Z,o_V

&A/B?MKITPUB个人空间append 数据不需要经过buffer cache , , 直接在hwm以上insert 到数据文件 , 不产生undo信息 , 利用hwm回滚,回滚后hwm不回退
-](@,e+u5_$Wv:H,}ITPUB个人空间
isy(J7Zcoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netappend 索引需要经过buffer cache, 但是是写入hwm之下的部分
|&Wzq?%`^
[GB%Z'k0xoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net

^!x{TW7jjm4qITPUB个人空间这里    “ 索引并不会“直接路径插入  ”  ,而是通过buffer cache,能说明 索引数据(新插入的数据index)在高水点之下, 有些不明白, hwm之下有空间来插入这些新的大量的index数据 ,还是....... ?
vjWy)jU2\boracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
!N}u Z6w.Mispace.itpub.net从索引并不会直接路径插入,看不出来索引数据是在高水标记之下。这是个推论,所以需要用实验证明一下了。因为索引并没绕过Buffer cache,而且对索引的修改产生了回滚,因此猜想索引的数据并没有到高水点之上寻找空间,而是按照普通的插入,在高水点之下插入。实验也证明了此点。
Q-U-Hruoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net设置_idl_conventional_index_maintenance 参数 为False后,索引应该也是“直接路径插入”了,这个参数我还没用过,在我的9i和10g中默认值都是True,我们可以试试。HP6x8k-s(W

nh%zRQ J/Ooracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net[ 本帖最后由 晶晶小妹 于 2008-4-3 14:23 编辑 ]
晶晶小妹的个人空间 晶晶小妹 发布于2008-04-03 21:59:28
YONG HUANG:我英文不好..看的头晕..;C#Mai\q"V2h
If you really want to avoid going through buffer cache even for the select part (which does a full table scan), oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net1~^&AQg@k*E

}X.}H0F(o}/m@y_ITPUB个人空间这句话中的EVEN,是不是只是做加强语气用的一个副词?可以翻译为甚至.或者不必翻译?
Yong Huang的个人空间 Yong Huang 发布于2008-04-04 04:48:31

QUOTE:

原帖由 晶晶小妹 于 2008-4-3 07:59 发表
^/jn]
T-C/g

YONG HUANG:我英文不好..看的头晕.."P~/F+m;wv B'D
If you really want to avoid going through buffer cache even for the select part (which does a full table scan),
6XqQ*TW+wITPUB个人空间2U qW]'J)cf-Q
这句话中的EVEN,是不是只是做加强语气用的一个副词?可以翻译为甚至.或者不必翻译?
.z        V"F?HO!j0^B }

/j/_b3l:loracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net翻译为甚至. Hope everything else is clear.h%N4C!j B!I'l$to5Do

Mq hT(C'k#e1R{dYong Huang
haorman zuohao_lu 发布于2008-04-04 10:34:12
支持.
eagle_fan发布于2008-04-04 13:23:31

QUOTE:

原帖由 Yong Huang 于 2008-4-3 12:13 发表

SkTuh3EY @0[ITPUB个人空间
Great posting! I'm learning from your posting.
+v;a
l2x_!}oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net

5[bz-C7LoSome minor comments. v$bh.objd is better matched against data_object_id. Some operations can change it to a value higher than object_id.+D
tXL"EZm

Qg5A j si`&x
将buffer cache清空, why not alter system flush buffer cache (or ALTER SESSION SET EVENTS 'immediate trace name flush_cache' in 9i). I remember somebody posted a test that seems to show bouncing the database could actually pre-load some block buffers and manually flushing it removes this artifact. But I never chased down the root cause.
R\uO5P;aITPUB个人空间f7SpQ'ib}J
If you really want to avoid going through buffer cache even for the select part (which does a full table scan), you can alter session set "_serial_direct_read"=true before the insert select.
a7G+]"A@J9Q
:gc/`-^:dspace.itpub.netI've never tested but can you test setting _idl_conventional_index_maintenance to false and see if the index can also behave the same way as the table in direct path insert? (I don't have access to a database right now.)Lg)m        dCA4s"p&q
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
xN3K5km3d

Yong Huang
WT7C*J-LU.VdOspace.itpub.netn;Av6|+C X#^2d
Considering the index maintenance mechanism, how can you expert index using direct path insert
Yong Huang的个人空间 Yong Huang 发布于2008-04-06 13:59:25

QUOTE:

原帖由 eagle_fan 于 2008-4-3 23:23 发表 a3Et M^dU
space.itpub.net}H*x        gZIA)Q
Considering the index maintenance mechanism, how can you expert index using direct path insert
~Wb$Ae;K[,n
-Q-d1h/We%[ T1u.QI thought about that. But was just curious about the description of this parameter _idl_conventional_index_maintenance, "enable conventional index maintenance for insert direct load". What could that mean? Maybe it's only about the indexes on those IDL% tables?ITPUB个人空间}Jh |        {1vA

U~;}d$f'v,rspace.itpub.netYong Huang
Yong Huang的个人空间 Yong Huang 发布于2008-04-07 00:02:21

QUOTE:

原帖由 Yong Huang 于 2008-4-5 23:59 发表
m$GvQ-J*d?[0s_
~[L|&DP        lI thought about that. But was just curious about the description of this parameter _idl_conventional_index_maintenance, "enable conventional index maintenance for insert direct load". What could that mean? Maybe it's only about the indexes on those IDL% tables?
$\*bqo2P/qspace.itpub.net A%@8Zs{$Oe+w)]%t-\8s
Yong Huang
2\        IL(BP$m1DHUUZ"}f
I did a test. That mysterious parameter has no effect. I would be surprised if there was some magic here. Data in an index has to be stored in order.
FhB m.X{ {,Zif(a
'^j#w+G_.k g$B'horacle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netYong Huang
upper123的个人空间 upper123 发布于2008-04-07 11:41:22
晶晶果然是个勤奋的人,这么长时间了,我一直都没有勇气做实验,呵呵。
bosonmaster的个人空间 bosonmaster 发布于2008-04-07 11:56:54
思路清晰啊,期待新的试验
我来说两句

(可选)

日历

« 2008-10-13  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

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

RSS订阅

Open Toolbar