测试步骤:
1、打开计时:
sql>set timing on
2、建立测试表:
sql>create table a(a int,b varchar2(1000));
3、测试:
a、不绑定变量 ,循环内提交:
begin
for i in 1..10000 loopexecute immediate 'insert into a (a,b) values('||i||',to_char('||i||'))';commit;end loop;end;Elapsed: 00:00:38.31sql>truncate table a;b、绑定变量,循环内提交beginfor i in 1..10000 loopexecute immediate 'insert into a (a,b) values(:1,to_char(:2))' using i,i;commit;end loop;end;sql>/Elapsed: 00:00:28.86秒
c、不绑定变量,循环外提交
beginfor i in 1..10000 loopexecute immediate 'insert into a (a,b) values('||i||',to_char('||i||'))';end loop;commit;end;sql>/Elapsed: 00:00:19.24秒
d、绑定变量,循环外提交
beginfor i in 1..10000 loopexecute immediate 'insert into a (a,b) values(:1,to_char(:2))' using i,i;end loop;commit;end;sql>/Elapsed: 00:00:12.66秒
排名:
1 不绑定变量, 循环内提交. 38.31秒
2 绑定变量,循环内提交 28.86秒
3 不绑定变量, 循环外提交 19.24秒
4 绑定变量,循环外提交 12.66秒
2 绑定变量,循环内提交 28.86秒
3 不绑定变量, 循环外提交 19.24秒
4 绑定变量,循环外提交 12.66秒
4:总结下:
在OLTP类型的系统中,会存在大量的重复执行的sql语句,只是WHERE后面的条件取值不一样,此时就需要绑定变量.
在循环处理时,commit的语句在循环体外还是循环体内,又或者可以设置一个整型自增变量取模值判断提交.
循环体内
i++;
if (i%5==0) {commit;}