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分,产生日志量较少,

且对系统性能几乎无影响。