由于项目需要,需要向数据库中导入6000万条数据。现有的资源是txt文本(数据用“,”分开的)。
方案一:转换成insert语句,但是执行效率太低,放弃。
方案二:使用plsql工具(tool-text import),这种效率大概是50万条每小时。由于时间紧急所以也不行。
方案三:使用sqlldr,这种效率还凑合,大概350万每小时。下面着重介绍下。
工具:sqlloader
前提:安装oracle服务端
环境:6000万数据、i5cpu,4g内存,oracle10g
步骤:
执行过程中的数据如下:
1. 书写ctl文件(本例risk.ctl):
OPTIONS(skip_index_maintenance=TRUE,direct=true,BINDSIZE=20971520,READSIZE=20971520,ERRORS=-1,ROWS=500000)
unrecoverable
load data
CHARACTERSET AL32UTF8
infile 'C:\Users\LHB\Desktop\TaxmodelData\PureRiskPremiumItem.txt'
insert into table pureriskpremium
Fields terminated by ','
trailing nullcols
(MODELCODE,
BASICRATECODE,
AREACODE,
BASICRISKPREMIUMS,
BIZVERSION,
EFFECTIVETIME,
OBTAINCREATETIME
);
解释:
ROWS=500000 每500000提交
C:\Users\LHB\Desktop\TaxmodelData\PureRiskPremiumItem.txt' 需要处理的真实
Fields terminated by ',' 分隔符,本例分隔符是“,”
pureriskpremium 表名
2. 打开cmd
sqlldr jyrluser/jyrluser@10.9.249.5:1521/xasccxdb1 control=C:\Users\LHB\Desktop\TaxmodelData\risk.ctl
log=c:\jrimp.log
解释:sqlldr 用户名/密码@真实的ip:端口号/实例名 control=控制文件地址 log=日志(失败时才有日志)
3. 回车后,如果没有报错,说明正在执行。每执行一定条数会提示出来。
4. 报错信息调试:
SQL*Loader-2026:加载因SQL加载程序无法继承而被终止
SQL*Loader-925:uldlfca:OCIStmtExecute(ptc_hp)时出错
ORA-03114:未连接到ORACLE
当时执行到3000左右时,报错了,然后查询报错日志,从日志中看出,字段定义长度太短,导致报了3000万条错误,后来扩充了字段。再次执行,就好用了。
C:\Users\Administrator>sqlldr xinjiatao/xinjiatao@127.0.0.1:1521/ORCL control=F:\New_Data\A\test.ctl log=c:\xin.log data=F:\New_Data\A\score_20170715.csv