在实际中常常有大量的数据需要导入到目前的数据库表中,Oracle提供的sqlldr命令很好的meet了这个需求。在使用的过程中,我们发现,如果在数据库的table端的Column中设置default值,但是使用sqlldr就不会起作用,也就是默认值没有设置成功,所以需要设置默认值得时候,我们将默认值写到了ctl文件中。ctl文件如下:
Load data
infile 'd:tempbuser.txt'
Append
into table tmp_temp
TRAILING NULLCOLS
(
phonenumber ,
addtime sysdate,
remark "suit"
)
在导入大量数据的时候i,sqlldr往往不敬人意,在导入的时候存在效率问题,可以通过一下几种方式提高sqlldr的速度.
1. 使用direct=Y 这是速度提高最快的方式
2. 使用大的readsize/streamsize 提高读写数据的缓冲区的大小
readsize 的最大值为21971520(20M). streamszie的最大值不清楚,我自己一般设置为21971520
3. 使用大的bindsize (只对conventional path load有效) , 提高一次提交的数据量, 效果也比较明显.
4. 使用大的columnarrayrows . Oracle9i的最大值在750000-800000之间,
Number of rows for direct path column array 提高direct load的效率,
5. 使用并行load, 最好运行两个不同的sqlldr程序, 指定每个ctl文件加载不同的内容.
6. 先删除加载表上的索引和约束. 具体效果不是很清楚, 但是, 肯定可以提高加载的速度.
7. 最好将加载表设置成nologging/unrecoverable, 对于conventional path load比较有用, 减少重做日志的写入.
8. 加大date_cache的大小, 在加载表有日期字段的时候能够提高加载的速度.
date_cache -- size (in entries) of date conversion cache (Default 1000)