oldwain随便写 http://oldwain.itpub.net/
<a href="http://oldwain.itpub.net">oldwain随便写</a>
itpub论坛回复: 直接赋值与select from dual的效率对比
上一篇 /
下一篇 2006-03-30 00:00:00
/ 个人分类:Oracle
问题: (MountLion )
直接赋值与select from dual的效率对比
在pl/sql中,可以直接给变量赋值,也可以使用select ... into var from dual,这两种方式效率有差别吗?
_-Ac[z$oW X-@"e0
Kt4XhhR0开始我认为,select 要慢些,因为需要扫描dual表,虽然表很小,但也有消耗。然而实验结果让我大跌眼镜:
代码:
declare
a varchar2(30);
begin
for i in 1..100000 loop
select user into a from dual;
end loop;
end;
3r J$O(X0B{U?0
declare
a varchar2(30);
begin
for i in 1..100000 loop
a:=user;
end loop;
end;
select from dual 居然比直接赋值快10%左右,经过翻来覆去的实验,结果还是这样。ITPUB个人空间)^ [zQ+M
ITPUB个人空间T@4N8s|A
哪位可以解释一下原因?
我的回答:
t&nL'Y-W1\Y0user是个sql函数, 所以ITPUB个人空间1n.qD;I"?Gn
a:=user;ITPUB个人空间s#k?;FV9Gr#MF
实际上相当于
-L(x](V~+JO(DS0select user into b from dual;ITPUB个人空间Q[3Y\t oY7y
D4l1d
a := b;
#e)gPr(W)c0ITPUB个人空间
P)Y7Sr9T;?(e\
如果把user换成一个字符串常量, 那么可以看到第二个查询明显快。
从dbms_profiler验证:
declare
wZ9@k` S0s%@g8X0a varchar2(30);ITPUB个人空间ym%A8W;L
begin
z(Iml
J,t0for i in 1..100000 loopITPUB个人空间@_!sX u
I6b
a:=user;ITPUB个人空间W"{'oO9na o|d*L
end loop;ITPUB个人空间,Y6\IR+ZQ ~F
end;ITPUB个人空间&D/w U9r.v"_5K9E,b,C
ITPUB个人空间)ga+s%{&W2N!BC:{)i KvB
Unit Line Occurrences Text
w6t)KaS/~v0ANONYMOUS BLOCK 1 2 ITPUB个人空间BcP:Y RnY9A
ANONYMOUS BLOCK 4 100001 ITPUB个人空间wjQ3P#B7q+UI)W
ANONYMOUS BLOCK 5 200000
这里的第5行(即a:=user;)执行了200000次,很是奇怪。 虽说我认为是相当于select user into b from dual;a := b; 但如果用select user into b from dual;a := b;代替a:=user; 并不会出现200000次的效果. 这个需要以后再仔细研究。
declare
L,u`}4yg+F0a varchar2(30);ITPUB个人空间^'a/pG!L7v k_X i
beginITPUB个人空间y4O*Y5z%}
for i in 1..100000 loop
}4b3h {$XA0select user into a from dual;
O)L%i4G`aJ8k0end loop;
(Es0v"h'Yw.`2ET0end;
&eeV*jdV~~w0
!uv0n2}Hc0Unit Line Occurrences Text
5A$MQeL C0ANONYMOUS BLOCK 1 2
)?m*{c1GP?0ANONYMOUS BLOCK 4 100001
5M/Zva4NAh0ANONYMOUS BLOCK 5 100000
再从sqltrace进行验证:
declareITPUB个人空间g5|/AA7aH1{ B
q
a varchar2(30);
ea l+A)|:^Ib^V0beginITPUB个人空间@;o0McR,@"K
for i in 1..100000 loopITPUB个人空间 `sTS:h-C~
a:=user;
v}w|\pe0end loop;
6d%gtV7]F0end;
call count cpu elapsed disk query current rowsITPUB个人空间"P
E5bf&Ih'P U
------- ------ -------- ---------- ---------- ---------- ---------- ----------ITPUB个人空间"b9i5V?Fw6Sqz\;V
Parse 1 0.00 0.00 0 0 0 0ITPUB个人空间a!ZB9j6@e
^Q$C
Execute 1 4.23 4.47 0 0 0 1ITPUB个人空间QE!W|"w
a Q
Fetch 0 0.00 0.00 0 0 0 0ITPUB个人空间%M.s/us:m&jEV
------- ------ -------- ---------- ---------- ---------- ---------- ----------
KhQpuc$|]&j@0total 2 4.23 4.47 0 0 0 1
Misses in library cache during parse: 1
0Q%V&o,~EA0Optimizer goal: CHOOSE
~h5s+j
X @%@+Z9{)k7N-d0Parsing user id: 59 ITPUB个人空间YU0B1?8w-N%~U
ZM
********************************************************************************
SELECT user ITPUB个人空间Q
f(j}3m;ZC3xt;aV
from
0wD
J b7a t4\0@1}0sys.dual
+]0f/Y I-}P)D0call count cpu elapsed disk query current rows
3M!j;u,eGz-C0------- ------ -------- ---------- ---------- ---------- ---------- ----------ITPUB个人空间
c8\/Y,Z[e)Ka
@
Parse 0 0.00 0.00 0 0 0 0
e.Z_T%xc@c^0Execute 100000 1.27 1.05 0 0 0 0ITPUB个人空间g6U&U^(O;J
Fetch 100000 1.37 1.35 0 300000 0 100000ITPUB个人空间}I6P&R)O8g+u/~
------- ------ -------- ---------- ---------- ---------- ---------- ----------
*uCg{3]1rVOmc0total 200000 2.64 2.40 0 300000 0 100000
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: