如何快速往表里插入大量的数据行

数据转储过程中往往涉及到数据的插入和删除。在数据量特别大的时候往往会消耗较长时间。

不卖关子,直接介绍一个我目前知道最有效的插入例子。

declare
type fid is table of dpcrm.t_cust_returnvisit.fid%type;
fids fid;
begin
     select fid bulk collect into fids from dpcrm.t_cust_returnvisit where rownum < 10000000;
     dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
     forall i in fids.first..fids.last
     insert/*+append_values*/  into sheng2(fid) values(fids(i));
     dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
end;

这个存储过程向表sheng2插入10000000条记录。

这个例子在如下几点有优化。

1.使用forall批处理,forall的高效不仅仅是插入,在update的时候也可以提高效率

2.使用/*+append_values*/ hint进行直接插入。还有一个提示是append。区别在于append后面要有select,append_values后面可以是values语法。这两种提示之所以会加快insert是因为:正常的insert操作会通过缓冲区缓存,并且为所有数据和元数据的变更创建撤销,为所有变更创建重做。而且会在已有块中寻找空间插入数据。这些都是需要付出极大代价的。

而使用hint之后,插入时将只为元数据的变更创建撤销和重做以便保护数据字典。插入数据将直接在高水位线上插入,不会利用已有块的空间。但是会维护索引。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值