oracle存储过程效率问题,处理1500w的数据插入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle存储过程效率问题,处理1500w的数据插入相关的知识,希望对你有一定的参考价值。

我写的存储过程有一段用到游标。对游标的每条结果进行拆分。就是这个游标每行数据有5个字段名。字段名对应5个编码,用DBLINK的方式插入到领张表中。对应的分别是
A,插入编码。B对应值。其他的字段名称跟每条的游标的字段名称一样。现在这个游标的数据有350W。也就是说插入最终表有1700W多。请问有什么好的做法吗
这个是sql

open datacur;
loop fetch datacur into rpt.a,rpt.b,rpt.c, rpt.zy,rpt.zc,rpt.zd,rpt.zr,rpt.df;
exit when datacur %notfound;
begin
insert into targ@dc_link
(a,b,c,bianma,zhi)values(
rpt.a,rpt.b,rpt.c,'01',rpt.zy);
insert into targ@dc_link
(a,b,c,bianma,zhi)values(
rpt.a,rpt.b,rpt.c,'02',rpt.zc
);
insert into targ@dc_link
(a,b,c,bianma,zhi)values(
rpt.a,rpt.b,rpt.c,'03',rpt.zd);
insert into targ@dc_link
(a,b,c,bianma,zhi)values(
rpt.a,rpt.b,rpt.c,'04',rpt.zr);
insert into targ@dc_link
(a,b,c,bianma,zhi)values(
rpt.a,rpt.b,rpt.c,'05',rpt.df);
commit;
exception
when other then
log_log(a,b,c)
rollback
end;
end loop;
close datacur;

处理大批数据的时候,游标对逐行处理会很慢,而且你的写法,commit在循环中,也会很慢。
其实你的功能可以用一个不循环的语句解决。
假设你定义游标的语句是(假设你的源数据表名为test):
select rpt.a,rpt.b,rpt.c,rpt.zy,rpt.zc,rpt.zd,rpt.zr,rpt.df from test rpt;
你的功能可以用以下语句解决:
insert into targ@dc_link (a,b,c,bianma,zhi)
select rpt.a,rpt.b,rpt.c,'0'||num,decode(num,1,rpt.zy,2,rpt.zc,3,rpt.zd,4,rpt.zr,5,rpt.df) from test rpt,(select rownum num from test where rownum<6);
commit;

这样的好处是语句和commit都只有一个,会快很多。

如果觉得有帮助,请采纳:)
参考技术A 1500W数据,写个循环,根据表里的字段划分成20个段,每段大约75W记录,当然段划分的多点,每次插入50W记录并提交是最好的,速度相对快点。

另inert into 要加并行插入,效率提升不是一点半点

insert /*+ append */ into table_name
参考技术B 触发器

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!

vaela

oracle存储过程中循环调用存储过程

参考技术A 1、没有必要每次都提交,到了CKPT,系统自动处理的
2、出现异常你可以回滚
3、提交了的不会回滚
4、调用的时候不提交,循环后统一提交
后面的问题:
关键的地方把SQL语句打印出来,根据这些SQL语句查询出数据做分析

以上是关于oracle存储过程效率问题,处理1500w的数据插入的主要内容,如果未能解决你的问题,请参考以下文章

oracle中的存储过程有啥作用,该怎么理解?(数据更新的话用update语句不就完了吗)

oracle的存储过程

oracle的存储过程的作用

oracle 存储过程,数据处理并返回结果集问题

oracle存储过程

oracle存储过程