您的位置:首页 > 运维架构

【原创】游标循环loop,while和for…

2014-03-10 10:09 330 查看
利用游标循环取大量数据时,性能显得十分重要,现在对三种循环进行一下性能的比较:

一、测试环境配置:

硬件 :
HP笔记本 intel core(TM)2
主频2.0GHz 3G内存 win7操作系统

工具 :
PL/SQL

数据库 :
oracle

-----------------------------------------------------------------------------

我的数据库中sb_kpxx表中含有103,521,479条数据,已经到达了亿的级别,所以可以拿来测试。测试时通过设置rownum参数,可以进行不同数量级的性能测试,由于时间关系,这里仅进行万,十万,百万级的测试。

二、测试代码如下:

--测试代码仅对取数据进行测试,并未进行数据操作!

--loop方式

set serveroutput on;

declare


v_num varchar2(100);


cursor c_num is select sb_num
from super.sb_kpxx where rownum < 60000;

begin


DBMS_OUTPUT.enable(800000);


Open c_num;


Loop


Fetch c_num into v_num;


exit when c_num%notfound;--未找到数据时退出(即到达记录末尾)。


End Loop;


Close c_num;

end;

/

--while方式

declare


v_num
varchar2(100);


cursor c_num is select sb_num
from super.sb_kpxx where rownum < 60000;

begin


Open c_num;


Fetch c_num into v_num;


While c_num%Found--能找到数据则执行循环内语句。


Loop


Fetch c_num into v_num;


End Loop;


Close c_num;

end;

/

--for方式

set serveroutput on;

declare


v_num varchar2(100);


cursor c_num is select sb_num from super.sb_kpxx where rownum <
60000;

begin


DBMS_OUTPUT.ENABLE (800000);


for cur in c_num--cur是固定自带的。


loop


v_num := cur.sb_num;


end loop;

end;

/

三、测试结果

这里各个级别均进行了5次测试,取平均值后填入下表:

级别

loop
while
for
万级 (6万)
0.59
0.646
0.059
十万级 (60万)
5.519
5.8
0.443
百万级 (600万)
55.047
55.817
4.348
千万级 (6000万)
未测
未测
71.729
单位:秒

四、结论:

从表中可以看出无论哪个级别,for循环的效率都是远远高出loop和while方式的,而loop和while则相差不大:

1.从消耗时间的数量级来看,loop和while均在同一个数据量级上,而for则比它们要第一个数量级。

2.当数据量到达百万级别时,loop和while已经快接近分的级别了,for仍在秒一级,直到千万级时才到达分的级别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: