今天做了1个数据导入需求,文本记录有128944条,TXT文件大小6253k,以前都是用oracle的text import方式导入,刚试验了一下,不灵验,当导入到2万多条的时候,PLSQL就当掉了,走不动了。
因为考虑到1次导入,所有决定采用SQLLOADER的方式。
使用方法可以看这位仁兄的文章,很详细。http://hi.baidu.com/zpdbdh/blog/item/547fdec9b7392d107e3e6f19.html
我测试了一下,的确很快。
环境1:(ID1,ID2....ID9),9个字段,而且导入数据按照数据字典中数据项顺序一致,文本9列,我的测试log如下:
我注意到运行的情况是1w条记录提交1次,控制台有信息可以看到
****************************************************************
128944 行 加载成功。
由于数据错误, 0 行 没有加载。
由于所有 WHEN 子句失败, 0 行 没有加载。
由于所有字段都为空的, 0 行 没有加载。
在直接路径中没有使用绑定数组大小。
列数组 行数: 5000
流缓冲区字节数: 256000
读取 缓冲区字节数: 1048576
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 128944
拒绝的逻辑记录总数: 0
废弃的逻辑记录总数: 0
由 SQL*Loader 主线程加载的流缓冲区总数: 32
由 SQL*Loader 加载线程加载的流缓冲区总数: 0
从 星期一 11月 30 14:05:38 2009 开始运行
在 星期一 11月 30 14:05:56 2009 处运行结束
经过时间为: 00: 00: 17.99
CPU 时间为: 00: 00: 00.78
****************************************************************************
环境2:(ID1,ID2....ID12),12个字段,而且导入数据与数据字典中数据项顺序不一致,有空行,文本9列,有3列文本没数据,我的测试log如下:
我注意到是50条
左右记录提交1次。所以这样的情况比较慢:看日志
****************************************************************************
128944 行 加载成功。
由于数据错误, 0 行 没有加载。
由于所有 WHEN 子句失败, 0 行 没有加载。
由于所有字段都为空的, 0 行 没有加载。
为绑定数组分配的空间: 148608 字节 (64 行)
读取 缓冲区字节数: 1048576
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 128944
拒绝的逻辑记录总数: 0
废弃的逻辑记录总数: 0
从 星期一 11月 30 14:31:04 2009 开始运行
在 星期一 11月 30 14:38:17 2009 处运行结束
经过时间为: 00: 07: 12.42
CPU 时间为: 00: 00: 02.67
****************************************************************************
同样的数据,导入数据的顺序不一样,结果是天壤之别,后者经过时间是前者的24倍,cpu时间是2.4倍。
如果要想导入够快,要数据字典中数据项顺序和数据值顺序一致(包括字段数量和排列顺序)。我想时间应该是花在数据匹配上。