继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

oracle- insert性能优化

PIPIONE
关注TA
已关注
手记 1123
粉丝 151
获赞 705

 看见朋友导入数据,花了很长时间都没完成!其实有很多快速的方法,整理下!

向表中插入数据有很多办法,但是方法不同,性能差别很大. 

 

 

----1.原始语句 

drop table t1 purge; 

 

create table t1 

sid number, 

sname varchar2(20) 

) tablespace test; 

 

 

 

create or replace procedure proc01 

sname varchar2 

as 

begin 

    for i in 1..10000000 

    loop 

        execute immediate 

        'insert into t1(sid,sname) values('||i||','''||sname||''')'; 

    commit; 

    end loop; 

end; 

 

 

 

alter system flush shared_pool; 

 

set timing on; 

 

exec proc01('ocpyangtest'); 

 

已用时间:  02: 02: 54.12 

 

 

 

 

 

----2.绑定变量 

 

 

 

drop table t1 purge; 

 

create table t1 

sid number, 

sname varchar2(20) 

) tablespace test; 

 

 

create or replace procedure proc02 

sname varchar2 

as 

begin 

    for i in 1..10000000 

    loop 

        execute immediate 

    'insert into t1(sid,sname) values(:no'||','''||sname||''')' using i; 

    commit; 

    end loop; 

end; 

 

 

 

alter system flush shared_pool; 

 

set timing on; 

 

exec proc02('ocpyangtest'); 

 

已用时间:  00: 22: 59.79 

 

 

select count(*) from t1; 

 

 

----3.静态语句 

 

 

 

drop table t1 purge; 

 

create table t1 

sid number, 

sname varchar2(20) 

) tablespace test; 

 

 

 

 

create or replace procedure proc03 

as 

begin 

    for i in 1..10000000 

    loop 

         

    insert into t1 values(i,'ocpyangtest'); 

    commit; 

    end loop; 

end; 

 

alter system flush shared_pool; 

 

set timing on; 

 

exec proc03; 

 

已用时间:  00: 20: 42.42 

 

select count(*) from t1; 

 

 

 

 

 

 

----4.批量提交 

 

 

drop table t1 purge; 

 

create table t1 

sid number, 

sname varchar2(20) 

) tablespace test; 

 

 

 

 

create or replace procedure proc04 

as 

begin 

    for i in 1..10000000 

    loop         

    insert into t1 values(i,'ocpyangtest'); 

    end loop; 

    commit; 

end; 

 

 

alter system flush shared_pool; 

 

set timing on; 

 

exec proc04; 

 

已用时间:  00: 11: 48.42 

 

 

 

----5.集合 

 

 

drop table t2 purge; 

 

create table t2 

sid number, 

sname varchar2(20) 

) tablespace test; 

 

 

 

 

alter system flush shared_pool; 

 

select count(*) from t1; 

 

 

set timing on; 

 

 

 

insert into t2 select sid,sname from t1; 

 

 

已用时间:  00: 01: 02.18 

 

commit; 

 

 

select count(*) from t2; 

 

 

 

----6. 集合+append 

 

 

drop table t2 purge; 

 

create table t2 

sid number, 

sname varchar2(20) 

) tablespace test; 

 

 

 

 

alter system flush shared_pool; 

 

 

select count(*) from t1; 

 

 

 

set timing on; 

 

 

 

insert /*  + append */ into t2 select sid,sname from t1; 

 

已用时间:  00: 00: 36.94 

 

 

commit; 

 

 

select count(*) from t2; 

 

 

 

 

 

 

----7. 集合+append+nologging 

 

 

drop table t2 purge; 

 

create table t2  

sid number, 

sname varchar2(20) 

) nologging tablespace test; 

 

 

 

 

alter system flush shared_pool; 

 

 

select count(*) from t1; 

 

 

 

 

 

 

set timing on; 

 

 

insert /*  + append */ into t2 select sid ,sname from t1; 

 

已用时间:  00: 00: 35.07 

 

commit; 

 

 

select count(*) from t2; 

 

 

 

 

 

  

----8.数据加载1 

 

 

drop table t2 purge; 

 

 

 

alter system flush shared_pool; 

 

select count(*) from t1; 

 

 

 

set timing on; 

 

 

 

create table t2 

as 

select sid,sname from t1; 

 

已用时间:  00: 00: 25.91 

 

 

 

select count(*) from t2; 

 

 

 

 

 

 

----9.数据加载2 

 

 

drop table t2 purge; 

 

 

 

 

alter system flush shared_pool; 

 

select count(*) from t1; 

 

 

 

set timing on; 

 

 

 

create table t2 nologging 

as 

select sid,sname from t1; 

 

已用时间:  00: 00: 04.89 

 

 

 

select count(*) from t2; 

 

 

 

----10.数据加载+并行 

 

 

drop table t2 purge; 

 

 

 

 

alter system flush shared_pool; 

 

select count(*) from t1; 

 

 

 

set timing on; 

 

 

 

create table t2 nologging parallel 24   --根据自己服务器情况 

as 

select sid,sname from t1; 

 

已用时间:  00: 00: 02.89 

 

 

select count(*) from t2; 

 

©著作权归作者所有:来自51CTO博客作者ocpyang的原创作品,如需转载,请注明出处,否则将追究法律责任

性能优化oracle- insertoracle


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP