2024年3月21日发(作者:)
在Oracle中如何对超大规模数据(如超过2亿条)进行insert 入库?
在实际生产环境下,有时需将超大规模数据(如超过2亿条)导入分区表,但因原表
与目的分区表的字段不一致,且用Kettle等转换工具极易失败,而用insert into select
t1,t2.. from tab的Oracle SQL方式直接执行将导致redo、undo日志暴增,使数据库容
易假死。
针对此问题,采用以下方法可完美解决,且对系统性能几乎无影响(不管是分区表还
是普通堆表都可行)。
1、将目标表(如tab)的索引及约束去掉,待insert完成后再建索引及约束;
2、将目标表的日志记录关掉,待插入完成后再打开:
alter table tab nologging;
----数据导入完成后开启方法如下------
alter table tab logging;
3、使用Copy 方法进行导入:
sqlplus user/pwd
--设置数组大小为5000
SQL> set arraysize 5000;
--设置提交次数为10次,即每产生5万条数据才提交一次
SQL> set copycommit 10;
--使用copy 语句来执行
--特别注意:insert into 在copy from 中无"into"语法,每个字段名称均应与目标
表字段名称一致,每行后需有“-”
SQL> copy from user/pwd -
> to user/pwd -
> insert tab using -
> select -
> ID , -
> TYPE , -
> to_date(SDATE,'yyyy-mm-dd') sdate ,-
> from tab_old;
4、执行结果如下:
数组提取/绑定大小为 5000。(数组大小为 5000)
将在每 10 个数组绑定之后提交。(提交的副本为 10)
最大 long 大小为 80。(long 为 80)
202769227 行选自 test
202769227 行已插入 TAB。
202769227 行已提交至 TAB 。
SQL> exit
经实际测试,约2亿条数据插入至新表中,耗时约1小时50分,产生日志量较少,
且对系统性能几乎无影响。


发布评论