黑马程序员技术交流社区

标题: 【石家庄校区】 如何在十分钟内插入1亿条记录到Oracle数据库 [打印本页]

作者: htb52110    时间: 2018-3-22 15:41
标题: 【石家庄校区】 如何在十分钟内插入1亿条记录到Oracle数据库
这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能。

-- Create table
create table TMP_TEST_CHAS_LEE
(
f01 VARCHAR2(20),
f02 NUMBER(10) not null,
f03 VARCHAR2(21),
f04 VARCHAR2(21),
f05 NUMBER,
f06 NUMBER(20)
);

--创建一个临时表,用于提供序列号
CREATE GLOBAL TEMPORARY table t_sequence_num(
sequenceNum number(8) not null
)
ON COMMIT PRESERVE ROWS;


--开始插入数据

begin
--先生成1万个序号
delete from t_sequence_num;
for i in 0..9999 loop
insert into t_sequence_num(sequenceNum) values(i);
end loop;

--使用APPEND提示,每次1万条,进行数据插入
for i in 1..10 loop
insert /*+ append */ into TMP_TEST_CHAS_LEE
(f01, f02, f03, f04, f05, f06)
select
8613800000000 + i * 10000 + t_sequence_num.sequencenum as MSISDN,
'12106000',
0,
'20120312072000',
'500231891000',
null
from t_sequence_num;

--每批次必须要提交一次
commit;

end loop;
end;
/

可以看出,这种方法的关键是使用了 APPEND 提示,也就是使用了 Direct Path Insert.
效果非常惊人,上亿的数据,十分钟左右就搞定了,也就是说,每秒钟插入了超过10万条以上的记录。

这个方法很简单,就是要利用 APPEND提示,方法就是需要有个序列表,来辅助数据生成。

性能测试人员不用耗费大量的时间来等待测试数据生成了。

需要注意的问题:
1. 插入数据时,表上不要建立索引
2. 可以在数据插入完毕后,通过 nologging 和 parallel 来创建索引
3. 这里默认是1万条记录提交一次,可以改的更大,应该会更快
4. APPEND方式插入数据后,必须要提交后才能对表进行其它操作

5. 生成的数据的每个字段都是可以根据自己的需要灵活产生的


作者: zhueian    时间: 2018-3-23 17:42
66666666666666666666




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2