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\Y0

user是个sql函数, 所以ITPUB个人空间1n.qD;I"? Gn
a:=user;ITPUB个人空间s#k ?;FV9Gr#MF
实际上相当于
-L(x](V~+J O(DS0select user into b from dual;ITPUB个人空间Q [3Y\toY7y D4l1d
a := b;
#e)gP r(W)c0ITPUB个人空间 P)Y7Sr9T;?(e\
如果把user换成一个字符串常量, 那么可以看到第二个查询明显快。

从dbms_profiler验证:

declare
wZ9@k` S0s%@g8X0a varchar2(30);ITPUB个人空间ym%A8W;L
begin
z(Im l 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 R nY9A
ANONYMOUS BLOCK 4 100001 ITPUB个人空间wjQ3P#B7q+U I)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/p G!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/Zv a4NAh0ANONYMOUS BLOCK 5 100000

再从sqltrace进行验证:

declareITPUB个人空间g5|/AA7aH1{ B q
a varchar2(30);
e al+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?Fw6Sq z\;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 aQ
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 Jb7a 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:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-11-23  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 2741
  • 日志数: 1042
  • 建立时间: 2007-11-28
  • 更新时间: 2008-02-22

RSS订阅

Open Toolbar