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

晶晶实验十六 详述逻辑读

上一篇 / 下一篇  2008-03-10 01:54:03 / 个人分类:晶晶oracle实验系列

查看( 486 ) / 评论( 40 )
晶晶实验十六 详述逻辑读ITPUB个人空间B*OLI9t@J
ITPUB个人空间*a yah UF
    这篇实验讨论下数据的读写过程.
f:o"o6e"} b'@ s j&]0    我们都知道,数据块是oracle最基本的读写单位,但用户所需要的数据,并不是整个块,而是块中的行,或列.当用户发出SQL语句时,此语句被解析执行完毕,就开始了数据的抓取阶段,在此阶段,服务器进程会先将行所在的数据块从数据文件中读入buffer cache,这个过程叫做物理读.物理读,每读取一个块,就算一次物理读.当块被送进buffer cache后,并不能立即将块传给用户,因为用户所需要的并不整个块,而是块中的行.从buffer cache的块中读取行的过程,就是逻辑读.为了完成一次逻辑读,服务器进程先要在hash表中查找块所在的cache buffer 链.找到之后,需要在这个链上加一个cache buffer chains 闩,加闩成功之后,就在这个链中寻找指定的块,并在块上加一个pin锁.并释放cache buffer chains闩.然后就可以访问块中的行了.服务器进程不会将块中所有满足条件的行一次取出,而是根据你的抓取命令,每次取一定数量的行.这些行取出之后,会经由PGA传给客户端用户.行一旦从buffer cache中取出,会话要释放掉在块上所加的PIN.本次逻辑读就算结束.如果还要再抓取块中剩余的行,服务器进程要再次申请获得cache bufffer链闩.再次在块上加PIN.这就算是另外一次逻辑读咯.也就是说,服务器进程每申请一次cache buffer链闩,就是一次逻辑读.而每次逻辑读所读取的行的数量,可以在抓取命令中进行设置.ITPUB个人空间M"k1O ab VWA,H)Pfb
    逻辑读和Cache buffer chains闩关系密切,TOM曾有文章提到,进程每申请一次Cache buffer chains闩,就是一次逻辑读。但是,逻辑读并不等同于Cache buffer chains闩,每次逻辑读,在9i中至少需要获得两Cache buffer chains闩。逻辑读是指在Hash表中定位块的这个过程。
9X3f,XK?[0
.yE7~E](| @0下面是我的测试
A eZ~4I(`#S0步1:建立测试表:ITPUB个人空间:E7bxJ}
create table jj_one(id number(5),name char(40));ITPUB个人空间BN"Iicb},`b
ITPUB个人空间y o;lvg-zZ
步2:插入100行
)zzgB%m1R_0begin
;eeQ2|4Pd`0   for i in 1..100 loopITPUB个人空间Pi+`V.z?re
     insert into jj_one values(i,'aaa');
CB c"Fi!E Fs0   end loop;
V7^WKu Azi0e4R-bl0end;
b)N#L;q9N.JY y0/
9d,fn(TT I0N0ITPUB个人空间qB6?o2U5N VR~*~[7S
或:insert into jj_one select rownum,'aaa' from dba_objects where rownum<=100;ITPUB个人空间 h5XHt"j
ITPUB个人空间7`.TE-I{,hZ#Gyy
步3:显示一下表中行的分布ITPUB个人空间5{2x@:h!A q ]]
sid=10 pid=11> select bk,max(id),min(id) from (select dbms_rowid.rowid_block_number(rowid) bk,id from jj_one) group by bk;ITPUB个人空间ZgTP_4O

"f)~?C p0        BK    MAX(ID)    MIN(ID)ITPUB个人空间0iW~"f*V
---------- ---------- ----------
(o2T%?g5];u2j4o0     42594         81          1
m9Jj'R|3[0     42595        100         82ITPUB个人空间 No"wgCE
ITPUB个人空间4Bx#}%D:zZ)z
可以看到,表共占两个块,ID从1到81的行在块42594中,ID从82到100的行在42595中。
!JE B(N,vG$n0
Fq jz?0步4:设备批量读取参数为15ITPUB个人空间E eu4B"g w
sid=10 pid=11> set arraysize 15ITPUB个人空间fX3A iZxy
因为9i或10g中的默认值都是15,如果并没有更改过这个设置,此步也可省去。ITPUB个人空间}7n^M$b5nKaJ_+Wn2|
ITPUB个人空间:OU T9bNG&`9l.g
步5:查看1行:ITPUB个人空间[8N3PS5R2N|
sid=11 pid=12> set autot trace stat
P'p }7icSg-S0sid=11 pid=12> select * from jj_one where id<=1;
K1NSJT d `Q0ITPUB个人空间 Rk K qk6t;KXC

4I_7vFKE+L LG}6L0统计信息
p(`$Xf3Tz7_^ ilT0----------------------------------------------------------ITPUB个人空间m[ e z&jb}f
          0  recursive calls
c3K6W&I3QJ;X Z3]0          6  consistent getsITPUB个人空间)EGm8v5\/}q-w5m;t$V
          0  physical readsITPUB个人空间;gIM2D_"[
        458  bytes sent via SQL*Net to clientITPUB个人空间n#r3x/tJ"C
        372  bytes received via SQL*Net from clientITPUB个人空间|8|E\/hX8P7U
          2  SQL*Net roundtrips to/from clientITPUB个人空间J9ns$}P)wF%g_'T
          1  rows processedITPUB个人空间Cqt4U/Mp_
(省略无关行)
@{~ a@0ITPUB个人空间J U+`J!L.v
逻辑读为6ITPUB个人空间ls)vF7E Z

E}X%J I)Qj#d!h6b G0步6:查询15行以内:ITPUB个人空间i ~a8o*QH-[u1`8_
sid=11 pid=12> select * from jj_one where id<=2;
v^ ]4{%M M!P{0ITPUB个人空间-y zq^2VS%L!E
统计信息
9Z S4A\F&U Rb5b:k| E0----------------------------------------------------------ITPUB个人空间NpK.KH
          0  recursive calls
|s~;r%O s\;z5T0          6  consistent gets
hy%kF6N5u8@/~0          0  physical reads
"Ol|k;d+g UB8n0        493  bytes sent via SQL*Net to clientITPUB个人空间 W1o-}&\8k
        372  bytes received via SQL*Net from clientITPUB个人空间KwHLj[ d0l&O
          2  SQL*Net roundtrips to/from clientITPUB个人空间+epZ2Y6Z4dH&jQ L
          2  rows processed
D5fH {1}eEa4h0ITPUB个人空间:\S4Yvx@:y#i^
在抓取行数小于15的情况下,逻辑读始终为6。
_b c7@H0ITPUB个人空间+Ug&^~ x-NX
步7:查询16行以上:ITPUB个人空间/|:\ Elc5H
sid=11 pid=12> select * from jj_one where id<=16;
+fE4gCBw0
J6qcS/C W1zz0已选择16行。
QT?t6H0
/U_"Y,QQ}$Hbt"f0统计信息
)s YS V)cO9y0----------------------------------------------------------
Y%|/G?*]a*Vi:Y0          0  recursive calls
hp4mI$vQ1aV3f0          7  consistent gets
Iu F)K"bq&_0          0  physical reads
)eW_z3sxyWx0        699  bytes sent via SQL*Net to clientITPUB个人空间Qy-K U? F y"O
        383  bytes received via SQL*Net from client
t$o%F;{1iS\j0~&uO0          3  SQL*Net roundtrips to/from clientITPUB个人空间!J Fk-Gp
         16  rows processed
:@$^T6@@R0ITPUB个人空间.[2j kC ^*^+v
逻辑读已经变成7次。
o;_@9x4V;lSdP d0ITPUB个人空间1sl\ M7lJ8H\/u/D
注意,在10G中,对块读的算法有改进。以同样的谓词条件,访问同样的行时,第一次访问时的逻辑读要比以后再行访问时多的多。因此,在10G中,同样的命令,多执行几次,这样看到的结果比较全面。
P$m!y PxcD0
(D[\;E:~QIq^0还有一点,访问15行以内时,为什么会有6次逻辑读?不应该是1次吗?这里,我相信Set autot trace stat命令本身有一定的原因,如果用下面的静态游标:
!cY}N.v0[r0ITPUB个人空间"GQzk}
sid=10 pid=11> alter session set events '10046 trace name context forever ,level 14';
JEhjW+?0会话已更改。ITPUB个人空间+ai2` m9CO&[,Y3n
ITPUB个人空间L1]-b(b5V0Kf"} z
declare
.^f*i{ [ n_^1WMQ0  type mid is table of jj_one.id%type;
:}#Tc u yoMK0  mid1 mid;
8p2T R%X;`m x0  cursor c is select id from jj_one where id>=1 and id<=15;
a ].G p?8F2q0beginITPUB个人空间+_}+g8V8o |0b~eh
  open c;ITPUB个人空间H6h(^n~d3C?
  fetch c bulk collect into mid1 limit 15;ITPUB个人空间0qK L!V6kw
  dbms_output.put_line(c%rowcount);
"w8j6qY(_7A0  close c;ITPUB个人空间 Jo7RJ+Dy
end;ITPUB个人空间$Je{e:iE0V L$^
/
)I x @"@"eu0ITPUB个人空间7r.{p(Mg0bm? Y&H
sid=10 pid=11> alter session set events '10046 trace name context off';
-k#H-M9G+C&E AA0会话已更改。ITPUB个人空间'] Bnb@O*MP YB
ITPUB个人空间Cq%Z} h/d
用Tkprof格式化跟踪结果:ITPUB个人空间*o Qp6_gA4xSX
E:\oracle\admin\mytwo\udump>tkprof mytwo_ora_756.trc m3.txt
rhbka U[0ITPUB个人空间;oK-bDRjV
查看M3.txt文件:ITPUB个人空间v6Cv*Ow
call     count       cpu    elapsed       disk      query    current        rows
Js*` }W cm0------- ------  -------- ---------- ---------- ---------- ----------  ----------
U-DV5V._$\ ^u0Parse        1      0.00       0.00          0          0          0           0ITPUB个人空间1H+WGg"{@G
Execute      1      0.00       0.00          0          0          0           0
X$a&\(Zwn#ZS g(U0Fetch        1      0.00       0.00          0          3          0          15ITPUB个人空间3|.}0{/j~ { Vp
------- ------  -------- ---------- ---------- ---------- ----------  ----------ITPUB个人空间A.sH]9T9n]
total        3      0.00       0.00          0          3          0          15ITPUB个人空间A#o@}$T7e[0F4|
ITPUB个人空间 E.pB&O#S.^8{
逻辑读只有3次。这3次逻辑读,有一次是针对行所在块的,其余两次是针对段头的。ITPUB个人空间8T\'@'~i4B

-W4k Wi? s_ j0
XI1Y"g{eACtb'y0实验完毕ITPUB个人空间;N {u!j p4vq

*p5w#]/o,U,W'EpO(~:r0从上面的实验中可以看出,“成批读取”中,批大小的设定,可以影响逻辑读的数量。批大小越大,读相同数量的行,逻辑读就越少。而且服务端和客户端交互的次数也越少,由网络传输的数据也可以减少,下面看一下测试:
k"]XL"yfY0批大小为1:
,uoC bP/d"f0sid=11 pid=12> set arraysize 1
h kw0T2jXt\ x O0sid=11 pid=12> select * from jj_one;ITPUB个人空间B@Q kt+y/Qu SJl
已选择100行。
X%u&vQ LQ0统计信息ITPUB个人空间m%w*OX p
----------------------------------------------------------
:K+G(eT\)u:U0         54  consistent gets
xKf&f(h,wa6KG!f0       7206  bytes sent via SQL*Net to client
| s,B[2Ms5^6c f?0        911  bytes received via SQL*Net from client
H}(mgmITKje0         51  SQL*Net roundtrips to/from clientITPUB个人空间 iv#^!v/vF `1?
        100  rows processedITPUB个人空间{1H+B+~%B?
批大小为100:ITPUB个人空间L^ km/V)j
sid=11 pid=12> set arraysize 100ITPUB个人空间dY m0tW,Ia ?r
sid=11 pid=12> select * from jj_one;ITPUB个人空间x2A#QoO
已选择100行。ITPUB个人空间(G.mC9u0G`o6c"?}
统计信息ITPUB个人空间xjY"gAU)YF
----------------------------------------------------------
h4w D1C*q [-Yg.RG0          6  consistent gets
(aW)zPk,lg0       1277  bytes sent via SQL*Net to client
+[&n2Xr:F4Db(yJL }0        372  bytes received via SQL*Net from clientITPUB个人空间6?bO_0cwQ+s
          2  SQL*Net roundtrips to/from clientITPUB个人空间EtER*z4m
        100  rows processedITPUB个人空间 a| V,PX1f1@n,^

;MLg_]W0差别是很明显的,bytes sent via SQL*Net to client的数值,相差了6倍左右。
Y9gCY9PO0
7Etb0DS)}Y w?q0但这并不代表将批大小设置的越高,速度就越快,否则,Oracle直接将它设置为一个最大的值,不就行了,干吗还要让我们去自己调节呢!ITPUB个人空间MV7KIi}+n
行从Buffer cache中读出来后,会先缓存在PGA中(具体是在游标的运行时区),然后再传给客户端。如果批大小过大,在PGA、客户端占用的内存也会增大。而且,如果渐歇性的在网络上传输大量数据,对网络也会有一定影响。下面来观察一下批大小对PGA的影响:
@GB1N j~0在会话11中执行如下过程:ITPUB个人空间w5A9XB\ N1bOK/o
declareITPUB个人空间 Vpqbo:s0bc+@6\G'm
  type mid is table of t1.id%type;
W:F.p'v;cGx0  mid1 mid;
+y9Eq J x+D(A6V,A@0  cursor c is select id from t1;ITPUB个人空间_l#d,Wz
begin
&[ MA/tS"]Trh4U`0  open c;ITPUB个人空间T+bT*L5X/J!g0Ix
  loopITPUB个人空间C!D S ~E:N%v
    fetch c bulk collect into mid1 limit 5000;ITPUB个人空间*GF6pH(s!k)c
  exit when c%notfound;ITPUB个人空间"T3b#Z^ G)M;?N
  end loop;ITPUB个人空间&ej-T,i Zf5WNM
  dbms_output.put_line(c%rowcount);
,U)]'i!B9jS8N t0  close c;
h0r*{(J)xW)X0end;ITPUB个人空间%C y']n4N
/ITPUB个人空间9G9LYJ4O @&x
ITPUB个人空间U!@ HWlP
在另一会话中观察会话11的内存占用情况:
"vTSp!H `0sid=10 pid=11> @pga   --此脚本下面有说明ITPUB个人空间C-G~HH7D
输入 user 的值:  11ITPUB个人空间#h5qHXav0M }s
原值    7: and b.sid= &user
?)gh:fZ0新值    7: and b.sid= 11ITPUB个人空间9qQ$YO^#P'N
ITPUB个人空间?Ni#t$N\J%IZ|"h
  PGA Used  PGA Alloc    PGA Max
X _*i0w]:?.DR0---------- ---------- ----------
ypo|6I(u.}0    561508     779492     779492
:K@w n1T,R?0ITPUB个人空间&CC-|[^Hqf
ITPUB个人空间|(H'eY k6@ R
然后将会话11中过程的批大小改为1:fetch c bulk collect into mid1 limit 5000; 再试一次
}e HG"?9i6^'Q0
qtH Z)ZU0在另一会话观察会话11的PGA占用情况:
5\.fM#t |{ t-K Q~X(C0sid=10 pid=11> @pgaITPUB个人空间_w!z[#h _
输入 user 的值:  11ITPUB个人空间bG ?,z:XJ
原值    7: and b.sid= &userITPUB个人空间 ]b uF3H3~g t
新值    7: and b.sid= 11ITPUB个人空间]"{_{w+V*ai6t

VsH2JP/[0  PGA Used  PGA Alloc    PGA Max
9J+dg9PX5[|0---------- ---------- ----------
| W'UK M`!@%h_Bw0    184388     250668     250668
}V?.zZH#Y6M R0
ekI i0YqA5g%L(T0批大小为5000时的内存占用,是批大小为1时的3倍左右。另外,测试表一定要大一些,我的测试表是1000000行,否则不容易看到结果。在10G中,可以得到基本相同的结果。
SZ;_.s B@ ~{0
K|5z&o&s+^V eP0PGA.SQL脚本如下:
\4e eR'?3~"O6Wr0--pga_by_process.sql:ITPUB个人空间 mQ| pVy i~
SELECTITPUB个人空间8t|(p0c-u
a.pga_used_mem "PGA Used",
&Y&o'R6uCM2{ ^0a.pga_alloc_mem "PGA Alloc",
Xp+H{E8?1Vr0a.pga_max_mem "PGA Max"ITPUB个人空间js'q ~6Qx
FROM v$process a,v$session bITPUB个人空间 B;oB @AB
where a.addr = b.paddrITPUB个人空间H:z}AIL
and b.sid= &user
:uV$E[c~+j3d0/

TAG:

bluemoon0083发布于2008-03-10 08:01:09
晶晶mm很认真啊,支持下
淡若煙飛发布于2008-03-10 10:15:32
学习,支持晶晶!
haorman zuohao_lu 发布于2008-03-10 10:17:48
看都没晶晶写得快space.itpub.net"FmV&~        _k
佩服
skelly skelly_huang 发布于2008-03-10 10:32:25
帮忙顶。
Alienovo的个人空间 Alienovo 发布于2008-03-10 10:38:39
晶晶真勤奋!
jieyancai发布于2008-03-10 10:39:31
严重支持!
五“宅”一生发布于2008-03-10 10:44:14
晶晶小妹的帖子我都收藏起来了。好好阅读!
plvision的个人空间 plvision 发布于2008-03-10 11:01:36
一直不太明白,现在看了明白了一点。
louis_xu的个人空间 louis_xu 发布于2008-03-10 11:07:53
都十六了?真是佩服!.Qh)@ w|u0[9p| |
晶晶的东西都很基础

LiBS`7LG
|
对从来没有系统学过ORACLE的我帮助很大
Qj,~kr`&Lzspace.itpub.net以前很多东西只知其然而不知其所以然s0qmo\UcBn.G
我打心眼里感谢晶晶!
Chanel [K] Kamus 发布于2008-03-10 11:11:00
呵呵,几天没来,居然出现了火爆的晶晶小妹。。。再次告诉我们世间无难事,只怕主义真啊。
3F8C-q%SM&])q'`
G

]3t2iP \tYITPUB个人空间支持一下晶晶小妹的原创,也提两个问题。
(S+Z(OE,}5H;BKoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
]vF;y1r
o,cY/t
1. 在10G中,对块读的算法有改进。以同样的谓词条件,访问同样的行时,第一次访问时的逻辑读要比以后再行访问时少的多。
:c,k1csbs)Xs4OX:[`!V^
能否详细说明一下?space.itpub.net4y;L8AR jx

m`EKs;y5w2. 访问15行以内时,为什么会有6次逻辑读?不应该是1次吗?这里,我相信Set autot trace stat命令本身有一定的原因。space.itpub.net?)}a3ix"O

0ufZ%uN n?ITPUB个人空间做一次10046 trace看看,你后面那次改用10046,但是也同样修改了执行语句,这不说明问题了。
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-10 11:33:53

QUOTE:

原帖由 Kamus 于 2008-3-10 11:11 发表 oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net$i%m\7p'N c0MK
呵呵,几天没来,居然出现了火爆的晶晶小妹。。。再次告诉我们世间无难事,只怕主义真啊。
r8At/X1W1WS#CUspace.itpub.net
,jbn4U{6IB支持一下晶晶小妹的原创,也提两个问题。
$B.f9q2O!vDH:U x{ITPUB个人空间
G0gxY]oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net1. 在10G中,对块读的算法有改进。以同样的谓词条件,访问同样的行时,第一次访问时的逻辑读要比以后再行访问时少的多。oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net        _+B'uy#O*Yyh
A


)fV1dpU3K#d:kpspace.itpub.net能否详细说明一下?
X\:}7[u$Si


)@S"x'x6PEe7Voracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net2. 访问15行以内时,为什么会有6次逻辑读?不应该是1次吗?这里,我相信Set autot trace stat命令本身有一定的原因。
BDc6h!P8O&OTt;E
+z| ~'I.w
Rf
做一次10046 trace看看,你后面那次改用10046,但是也同样修改了执行语句,这不说明问题了。
_%k@ @M
r.j


9d'i1hY{D:t5eN回答问题一:应该是多很多..失之毫厘差之千里.严重失误...sorry,马上改.oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net)D-Acg1|q
y3V

  问题二:我的ID列是从1开始顺序排列,没有重复,所以ID<=15 和ID>=1and ID<=15 结果是一样的.这个我测试过.结果一样.
Forrest Gump的个人空间 nmghailang 发布于2008-03-10 11:35:29
晶晶小妹,真是高手,小弟佩服阿
蚊子窝 foxmile 发布于2008-03-10 12:00:47
begin
c*U)lPUS5W%lITPUB个人空间   for i in 1..100 loop
rF8j4u5W7T}     insert into jj_one(i,'aaa');
]]z!YS` ]5QUYspace.itpub.net   end loop;ITPUB个人空间)|4?f$eF&a0v9mN
end;$a%W1Q)Hn+C3C
/oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net^;bU7H`F,F8T:@'{

;zp3Y2hs(Wl晶晶,这个语句能执行么?不太清楚你试验的时候到底用的哪个语句。你把它贴上来是为了什么?
7b7OX+O
Q7SoV,RX([v

Gnb
@ B9DITPUB个人空间
[ 本帖最后由 foxmile 于 2008-3-10 12:13 编辑 ]
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-10 12:14:43

QUOTE:

原帖由 foxmile 于 2008-3-10 12:00 发表 space.itpub.net7}PV9A@n/t%f
begin
R5wDq"i6qITPUB个人空间   for i in 1..100 loop
X5Ih2ow\R5n-ZITPUB个人空间     insert into jj_one(i,'aaa');ITPUB个人空间)d
p5H_Ta%q

   end loop;0y3{xs,Z$fU
end;
j}W"U O4tF q,^L/
J7vUOqa5moracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
s9_,@!t5|G j.}晶晶,这个语句能执行么?不太清楚你试验的时候到底用的哪个语句。你把它贴上来是为了什么?
Xk
UV;ie
J$I

        P^0jy/vH&w}space.itpub.net7?+sW,~,|l"Ea
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netv(x^9Zy/P!| r2p&K5S

${l6{-[f.x我错了
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-10 12:16:50
我把插入记录的命令贴上来是因为想让大家更明白我的测试环境,US)y0LXa9E3R'J
实验是先完成,看到结果后,我是手动打上来的,不是粘的..oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net+on`-G%^9WV:D5I
@8O[kI6D
检查了2遍还是错的一团糟....oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net oM,{CX*NB|
.fM
AD'iWC5k

5555555~~~~
蚊子窝 foxmile 发布于2008-03-10 12:23:17

QUOTE:

原帖由 晶晶小妹 于 2008-3-10 12:16 发表
o"q0F5m#?w#h~我把插入记录的命令贴上来是因为想让大家更明白我的测试环境,oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netQsH!yl;D!uU:e
实验是先完成,看到结果后,我是手动打上来的,不是粘的..2c*lffu^,i4];z
Q

Z,B&C"m p q ^(~5Y
检查了2遍还是错的一团糟....oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net#f        BC*MC'k/n
ITPUB个人空间 i^&q;^%]        qvZ
5555555~~~~
7\8B!yi:`,sl呵呵。我建议,我也是一直这么做的。试验的时候,不要中断,出了异常也不要退出,最终直接将sqlplus里面的内容直接贴出来,当然一些没有意义的出错,就不用贴了,但是尽量保证试验的真实性。ua:A^Ei'P

y6jx^a$]P4k*_(^"[space.itpub.netps:我试了一下,我这里的逻辑读一直都是0,包括其他统计信息。只有oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net)]'J6_1Y Y
         n  rows processed `s,L
I9^

你觉得什么原因。
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-10 12:42:41
实验绝对是真实滴..k)Zh5M4f+d`pKg|A
TGpF$Qp
中断实验去粘来粘去的..感觉很.@#$%^&
9h(y!XV#T#G0o2z7moracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net(I!OG:[3fDdyZ_
建议:跟踪查看下...
蚊子窝 foxmile 发布于2008-03-10 12:45:14
sid=11 pid=12> set autot trace stat
k`|j5jFZ

sid=11 pid=12> select * from jj_one where id<=1;&j2Y5G KB2D:O?

s/BRq2?~"}t'e这个也改改。set autotrace trace stat;
蚊子窝 foxmile 发布于2008-03-10 12:45:58

QUOTE:

原帖由 晶晶小妹 于 2008-3-10 12:42 发表
1z8zKjp'b~BITPUB个人空间实验绝对是真实滴..
Z*S^ Ty#^;H!I#E
R9|:rf:g4Z#F5{oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net中断实验去粘来粘去的..感觉很.@#$%^&
9Q"of;Zt/@
JE{9p^-M
_U+@ke
建议:跟踪查看下...
.mx7NXb]G2{
好。我开sql_trace看看
tanfufa发布于2008-03-10 13:06:42
鼓掌.
magic007的Oracle空间 magic007 发布于2008-03-10 13:13:17
真勤奋呀,凌晨2点还在战斗。学习
Chanel [K] Kamus 发布于2008-03-10 13:32:02

QUOTE:

原帖由 晶晶小妹 于 2008-3-10 11:33 发表 1i;jCYsS$@
Q}~L5@n9F?)?

&b4e$O+_Mdc回答问题一:应该是多很多..失之毫厘差之千里.严重失误...sorry,马上改.space.itpub.net)f3h7e-b Q$D1c1Nvq YQ)n
  问题二:我的ID列是从1开始顺序排列,没有重复,所以ID<=15 和ID>=1and ID<=15 结果是一样的.这个我测试过.结果一样.
ITPUB个人空间7p6epCl?}:q1X5j
4Qs1H6z'b&G(k:e
我不知道你测试的版本,我这里的版本是10.2.0.1
*pLw e3tz LS wspace.itpub.netoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net1[:E$Li!t#H
1. 值得商榷。
A,a%p_@%d2F4K6{我的观点是10g对块读算法并无改进,或者说即使算法有改进也并无体现在第一次cr和后面几次cr的不同上。之所以使用set autotrace on,导致第一次显示的cr值偏高,是因为第一次执行SQL还有parse cousor的操作,这部分操作也同样有cr的,如果是用10046 trace,只观察sql的fetch部分,每次cr都是一样的。
,X
|)s0j2c2voracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net

iL^0z8AR goracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net2. 值得商榷。7d5a{_J9d0@+C
在10.2.0.1版本中,按照你的测试,每次总的cr都包括额外的7个cr消耗,也就是如果实际上返回数据只需要1次cr的话,显示的总cr是8,需要2次cr的话,显示的总cr是9。这个无论是autotrace还是10046,结论都是一样的。
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-10 13:42:01

QUOTE:

原帖由 Kamus 于 2008-3-10 13:32 发表
^a
[P nA~C
NP3Q,k M5\"wd

:xZM8nN-?我不知道你测试的版本,我这里的版本是10.2.0.1
|\ PL*\&[space.itpub.net
)ZE1H6DlG3Z4^space.itpub.net1. 值得商榷。
6kB3WR)WD}%_8v"j我的观点是10g对块读算法并无改进,或者说即使算法有改进也并无体现在第一次cr和后面几次cr的不同上。之所以使用set autotrace on,导致第一次显示的cr值偏高,是因为第一次执行SQL还有parse cousor的操作,这部分操作也同样有cr的,如果是用10046 trace,只观察sql的fetch部分,每次cr都是一样的。space.itpub.netc9z9rTu+J        ri4Bt?
0Y?,V/NXB2}
2. 值得商榷。oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netEI`8V?lV1x
在10.2.0.1版本中,按照你的测试,每次总的cr都包括额外的7个cr消耗,也就是如果实际上返回数据只需要1次cr的话,显示的总cr是8,需要2次cr的话,显示的总cr是9。这个无论是autotrace还是10046,结论都是一样的。
,Z fI'Q&Uy?/QITPUB个人空间
o-g(Kj3rDoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netC+x0eXcv0T
问题1,我在10G下再试试.oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netTq1n ai(uX*[,fw}
问题2,我的测试不是7个吖.如果不用游标抓取,在PLSQL窗口中执行的话,将扫描高水标记之下表全部的块,我的表目前段头在42593块,区大小是16,表空间是手动空间管理的,高水标记在42597,也就是说实际块是42593,4,5,6这4个块,段头要被访问三次,总共6次逻辑读,
shiri512003发布于2008-03-10 13:42:15
不错的探讨0Q R/GXl1S
精彩不断呀
2WG`%B au*^8Q        |oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net可惜我只会看~~~ITPUB个人空间4Tnfr][|-P
o(∩_∩)o...哈哈
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-10 14:04:36
前面我说错了点:SET AUTOT TRACE STAT 对逻辑读次数的观测并没有影响.ITPUB个人空间Q
A*v'T,@HW![&q

"Q(Jl$pD{i6Q!l&N }
表现在高水标记之下共有块:42593   42594    42595     42596 oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net+hi*m&Y1L
            此块是段头   数据块 ZD1hr^2y*~
            需要访问3次  1次   1次   1次   共6次逻辑读
蚊子窝 foxmile 发布于2008-03-10 14:12:25

QUOTE:

原帖由 Kamus 于 2008-3-10 13:32 发表 oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netVX9b_Zn:Wn
space.itpub.net6\i K4S'?P|

~:Z/wJ%A D4mG'SITPUB个人空间我不知道你测试的版本,我这里的版本是10.2.0.1MUdK#Y(~
space.itpub.net5M:z'u.V J8[p
T[

1. 值得商榷。
et'J8ehaspace.itpub.net我的观点是10g对块读算法并无改进,或者说即使算法有改进也并无体现在第一次cr和后面几次cr的不同上。之所以使用set autotrace on,导致第一次显示的cr值偏高,是因为第一次执行SQL还有parse cousor的操作,这部分操作也同样有cr的,如果是用10046 trace,只观察sql的fetch部分,每次cr都是一样的。
j V"|7w0V~f)x
Z

*pb@`?6isWoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net2. 值得商榷。oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net%mhEc#[;?
在10.2.0.1版本中,按照你的测试,每次总的cr都包括额外的7个cr消耗,也就是如果实际上返回数据只需要1次cr的话,显示的总cr是8,需要2次cr的话,显示的总cr是9。这个无论是autotrace还是10046,结论都是一样的。
vuaM1W8vYa
B`(ddN
io5yeR
我觉得不是额外的cr消耗,而是和试验所用的总数据量,即总的块数有关。
$k)tjx5|jITPUB个人空间如果块数多,起点的cr消耗就很大。做了下试验。确实如此。
S(k3_ P3Z9V:SM^ITPUB个人空间在100条数据情况下,我的环境起点是8+`R U$t$t#x)D
10000条数据情况下,我的环境起点是35。#b
G%wR&G|3B3]

并不是额外的消耗,而是相关读取必须的消耗。当然如果采用索引或者其他访问方式,会有不同的效果。space.itpub.netP)v0ht*Z.ePn.I
space.itpub.netAXq~:y hl${
c5x0K

[ 本帖最后由 foxmile 于 2008-3-10 14:17 编辑 ]
Chanel [K] Kamus 发布于2008-03-10 14:49:45

QUOTE:

原帖由 foxmile 于 2008-3-10 14:12 发表 royL.]MyL&PT
ITPUB个人空间f ~1B2kJK

Fp(pq){space.itpub.net我觉得不是额外的cr消耗,而是和试验所用的总数据量,即总的块数有关。
W*o0H&lcA如果块数多,起点的cr消耗就很大。做了下试验。确实如此。
_2mj$D%{:f5N1zspace.itpub.net在100条数据情况下,我的环境起点是8N%@+v4qA E%@ n(J
10000条数据情况下,我的环境起点是35。ITPUB个人空间yg.|(U C EP Yl9_g
并不是额外的消耗,而是相关读取必须的消耗。当然如果采用索引或者其他访问方式,会有不同的效果。
ITPUB个人空间E        y(C
\+h1zy j


0EcF
Z        ]lqboracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
没错。
7elJPMxITPUB个人空间&Y f4P)wss'c
不过,我所指的额外是对晶晶的关于arraysize和cr关系这一部分而言的,也就是除去真正fetch数据时候的其它cr消耗,比如对于段头的cr,对于bmb位图块的cr,当记录越多,所占的block越多,必然导致读取段头和bmb块的次数增多,这些都算额外的,呵呵。因为如果要从实际上来说,任何cr都是必须的,确实没什么额外之说。
Chanel [K] Kamus 发布于2008-03-10 14:51:27

QUOTE:

原帖由 晶晶小妹 于 2008-3-10 13:42 发表
aI0u0vh        [*X7a
`

oc"xHm\TITPUB个人空间表空间是手动空间管理的
D ckbR9ugd+X @space.itpub.net]d)utJ9Z lD
你可以换成ASSM的表空间再测试一下
蒙昭良的个人空间 mengzhaoliang 发布于2008-03-10 15:18:33
晶晶很不错啊,把kamus也吸引过来了
晶晶小妹的个人空间 晶晶小妹 发布于2008-03-10 15:40:21

QUOTE:

原帖由 Kamus 于 2008-3-10 14:51 发表
wPq(b5L7S,Qspace.itpub.net
)dT0h,G3ow+nu#y/JYspace.itpub.netv-X
a W
\

你可以换成ASSM的表空间再测试一下
@[FZI3RG
$A
D!uIv        w5p'{*zuspace.itpub.net
oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net%y rY;S;PE
正有此意,不过我记得ASSM中,全表扫描是不读取L1、L2块的。这点我不能肯定,去试试再说!
我来说两句

(可选)

日历

« 2008-10-13  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

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

RSS订阅

Open Toolbar