pl/sql中三种游标循环效率对比(三)
显然要快了许多.我们可以看到,它是先执行游标语句SELECT A FROM BIG_DATA,然后一次FETCH出来.一次处理999999行.
第三个游标方式的trace文件如下:(多条处理)
763 PARSING IN CURSOR #6 len=105 dep=0 uid=84 oct=47 lid=84 tim=1357454481979282 hv=97100697 ad='3faaba00' sqlid='46bkjvc2wm8wt' 764 declare 765 v_a big_data.a%type; 766 begin 767 for x in (select a from big_data) loop 768 v_a:=x.a; 769 end loop; 770 end; 771 END OF STMT 772 PARSE #6:c=9998,e=10050,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=1357454481979278 773 ===================== 774 PARSING IN CURSOR #4 len=22 dep=1 uid=84 oct=3 lid=84 tim=1357454481979809 hv=3992159408 ad='3aae4de0' sqlid='3w21sgzqz715h' 775 SELECT A FROM BIG_DATA 776 END OF STMT 777 PARSE #4:c=0,e=25,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,plh=3104650627,tim=1357454481979806 778 EXEC #4:c=0,e=48,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,plh=3104650627,tim=1357454481980067 779 FETCH #4:c=1000,e=1012,p=20,cr=4,cu=0,mis=0,r=100,dep=1,og=1,plh=3104650627,tim=1357454481981179 ... 10778 FETCH #4:c=0,e=78,p=0,cr=1,cu=0,mis=0,r=99,dep=1,og=1,plh=3104650627,tim=1357454482759857 10779 CLOSE #4:c=0,e=2,dep=1,type=3,tim=1357454482759906 10780 EXEC #6:c=780882,e=780310,p=1832,cr=11798,cu=0,mis=0,r=1,dep=0,og=1,plh=0,tim=1357454482759962
可以看到这种处理方式的CPU time和第二种还是很接近的,只差了一个数量级,这种隐式循环的游标语句,其实也是一种批量处理的过程,它每次读取了多行数据到缓存.
我们可以看到总的FETCH次数只有1万多一点,比第一种的100多万整整降低了100倍.
通过FETCH行中的r值我们可以看到,每次取的是近100行数据,可见这种隐式游标循环也是一种批量处理的过程.
个人一般情况下喜欢第三种方式的游标处理方式,原因有2点:1,代码简短,省却了游标变量的定义; 2.在不用使用到集合变量情况下(不使用BULK COLLECT时),速度也很快