100万条记录的数据加载

-- 测试数据生成
-- 制造测试待导入数据,保存为 getobject.sql 
select count(1)*20 from dba_objects; -- 1504200


select a.owner || ',"' || a.object_name || '",' || a.object_id || ',' ||
       to_char(a.created, 'yyyy-mm-dd hh24:mi:ss') || ',' || a.status
  from dba_objects a, (select rownum rn from dual connect by rownum < 20) b;


-- 保存为 call.sql
set echo off
set term off
set line 1000 pages of
set feedback off
set heading off
spool /u02/script/ldr_object.csv
@/u02/script/getobject.sql
spool off
set heading on
set feedback on
set term on
set echo on


-- 调用
@/u02/script/call.sql




-- 执行完毕之后查看生成的文件
-- 直接通过sqlplus导出生成的文件不可用,需要使用 awk 进行处理
-- 去掉行前后空格
awk 'gsub(/^ *| *$/,"")' ldr_object.csv > 1.csv 
-- 去掉空行
awk '!/^$/' 1.csv>2.csv
host ll /u02/script/2.csv


rm -rf ldr_object.csv
mv 2.csv ldr_object.csv


-- 初始化环境
conn tumo/tumo
create table objects(
  owner varchar2(30),
  object_name varchar2(50),
  object_id number,
  status varchar2(10),
  created date);


create index idx_obj_owner_name on objects(owner, object_name);


-- 执行导入
-- 创建控制文件如下,保存为控制文件 ldr_object.ctl
load data
infile 1.csv
truncate into table objects
fields terminated by "," optionally enclosed by '"'
(owner, object_name, object_id, created date 'yyyy-mm-dd hh24:mi:ss', status)


-- 按照默认设置尝试导入
sqlldr tumo/tumo control=ldr_object.ctl errors=10


-- 导入完成后查看日志,记录用时。
1429028 Rows successfully loaded.
Elapsed time was:     00:04:50.35
CPU time was:         00:00:27.37


-- 加快导入速度
-- sqlldr 常规路径导入默认一次加载64行,现首先尝试修改这默认值
sqlldr tumo/tumo control=ldr_object.ctl errors=10 rows=640


-- 导入完成后查看日志,记录用时
-- 导入日志提示:
value used for ROWS parameter changed from 640 to 198
表示指定640已经超出参数 bindsize 的默认值,因此自动修改到最大可承受的198行。但是导入用时还是有所减少:
1429028 Rows successfully loaded.
Elapsed time was:     00:03:15.21
CPU time was:         00:00:19.04


-- 进一步修改 bandsize 参数值,默认为256K,同时提高每次加载行数:
sqlldr tumo/tumo control=ldr_object.ctl errors=10 rows=5000 bindsize=10485760


-- 查看日志统计信息
Space allocated for bind array:                6450000 bytes(5000 rows)
Read   buffer bytes:10485760
Elapsed time was:     00:02:11.33
CPU time was:         00:00:13.71


-- 尝试使用直接路径加载看是否能进一步提交效率
sqlldr tumo/tumo control=ldr_object.ctl direct=true


-- 查看日志统计信息
Elapsed time was:     00:00:54.34
CPU time was:         00:00:09.20


-- 尝试在直接路径的基础上修改以下参数:
streamsize:直接路径加载默认读取全部记录,因此不需要设置rows参数,读取到的数据处理后存入流缓存区,即 streamsize 参数。该参数默认值为 256K。
date_cache:该参数指定一个转换后日期格式的缓存区,以条为单位。默认值为1000,即保存1000条转换后的日期格式。


sqlldr tumo/tumo control=ldr_object.ctl direct=true streamsize=10485760 date_cache=5000


-- 查看日志统计信息
 Date cache:
   Max Size:      5000
   Entries :      1172
   Hits    :   1427856
   Misses  :         0


Elapsed time was:     00:00:33.02
CPU time was:         00:00:04.79


从日志信息可以看出,date_cache的值指定过大,指定 1200 就足够了,因为日期的唯一性比较低。


上述导入过程中,如果将表对应的索引置为 disable, 导入效率还会更快。


参考:
《涂抹Oracle-三思笔记之一步一步学Oracle》
http://bbs.linuxtone.org/thread-21820-1-1.html

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30168575/viewspace-1767145/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30168575/viewspace-1767145/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值