-- 测试数据生成
-- 制造测试待导入数据,保存为 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
-- 制造测试待导入数据,保存为 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/