oracle数据库写速度,Oracle数据库测试数据插入速度

execute immediate是一种动态SQL的写法,常用于表名字段名是变量,入参的情况,由于表名不知道,所以不能直接写SQL ,所以要靠动

一,没有优化的速度:Executed in 69.436 seconds

drop table t purge;

create table t(x int);

/*清空共享池,注意在生产环境中千万不能做这步操作*/

alter system flush shared_pool;

create or replace procedure proc1

as

begin

for i in 1 .. 100000

loop

execute immediate

'insert into t values('||i||')';

commit;

end loop;

end;

/

下面查看下proc1插入100000记录的执行时间

SQL> set timing on;

SQL> exec proc1;

PL/SQL procedure successfully completed

Executed in 69.436 seconds

/*我们可以通过下面的语句查看此存储过程执行的具体步骤*/

select t.sql_text,t.sql_id,t.parse_calls,t.executions from v$sql t where sql_text like '%insert into t values%';

为了方便查看我用PL/SQL DEVELOPER 执行的上面语句,如下图:

f6935bb18aeacd8dd5aba22e50f99a90.png

从上面可以看出,每个语句都只是解析了一次,执行了一次,一共解析了10万次,也许你会问你上面只有7136行记录啊,你怎么说是解析了10万次呢。我可以告诉你肯定是解析了10万次,因为我的共享池空间不大,容纳不小10万条信息,根据FIFO 的原理你可以看出,现在我查出来的都是从92000多开始的SQL STATEMENT记录。我们知道这些SQL语句都是相似的没有必要解析10万次,即每一条语句都解析一次。这个PROC1 没有用绑定变量,这就是我们可以优化的地方。我们用绑定变量来重新测试下,下面的PROC2就只用解析一次就可以了,当然速度肯定会提高不少。

二,使用绑定变量优化后的速度:Executed in 26.505 seconds

drop table t purge;

create table t(x int);

/*清空共享池,注意在生产环境中千万不能做这步操作*/

alter system flush shared_pool;

create or replace procedure proc2

as

begin

for i in 1 .. 100000

loop

execute immediate

'insert into t values(:x)' using i;

commit;

end loop;

end;

/

SQL> set timing on;

SQL> exec proc2;

PL/SQL procedure successfully completed

Executed in 26.505 seconds

从上面可以看出,时间基本上减少了一半。

/*我们可以通过下面的语句查看此存储过程执行的具体步骤*/

select t.sql_text,t.sql_id,t.parse_calls,t.executions from v$sql t where sql_text like '%insert into t values%' order by 1;

650eb440d70e5497368cb08f6e64971c.png

从上面的执行情况可以知道,解析了一次,执行了10万次。完全符合我们的猜想,所以速度大大提升了。

execute immediate是一种动态SQL的写法,常用于表名字段名是变量,入参的情况,由于表名不知道,所以不能直接写SQL ,所以要靠动态SQL语句传人表名和字段名参数拼接成SQLSTATEMENT,,有execute immediate调用执行。但是我的这个例子完全可以不需要动态的,可以用静态的写好。

更多详情见请继续阅读下一页的精彩内容:

logo.gif 本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:php中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值