您的位置:首页 > 其它

大批量导入导出数据的一点体会。

2009-11-20 17:34 253 查看
今天我测试了下批量导入导出数据。



首先,我用spool从A数据库中导出数据到一个文本文件,但是发现速度有些慢。因为表中数据有120多万条。后来就用pl/sql里面的export query将数据导出到csv文件,这样速度是快。可是这样导出的文件,用sqlldr导入到新库中去的时候,老是报错。而我查了数据,数据是没有问题的。最后,我用toad里面的"Save Grid Contents",导出文件格式为txt,这个时候,数据才没有问题。可以顺利的导入到新库中去。只是导入速度上还不是特别满意,但是还凑合着用了。估计是我机器性能不是太好的原因。



Save Grid Contents的按钮如下:







示例:

1,exp_customer.sql。 查询数据。这个用过,但是速度不行。还不如用toad导出数据为txt。

set echo off --是否显示执行的命令内容

set feedback off --是否显示 * rows selected

set heading off --是否显示字段的名称

set verify off --是否显示替代变量被替代前后的语句。fil

set trimspool off --去字段空格

set pagesize 50000 --页面大小

set linesize 50 --linesize设定尽量根据需要来设定,大了生成的文件也大

define fil= 'E:/1120/customer_data.txt'

spool &fil

select customerid || '@@' || customername || '@@' || sex || '@@' ||

customertype || '@@' || papertype || '@@' || paperno || '@@' ||

customerclass || '@@' || industry || '@@' || status || '@@' ||

postlevel || '@@' || operatorcode || '@@' ||

to_char(createtime, 'yyyy-mm-dd hh24:mi:ss') || '@@' || remark || '@@' ||

busipassword || '@@' || customerprops || '@@' ||

to_char(statusupdatetime, 'yyyy-mm-dd hh24:mi:ss') || '@@' ||

passwdlevel

from t_customerinfo ci;

spool off

2,customer.ctl。控制文件。为sqlldr所用。

OPTIONS (ROWS=10000)

LOAD DATA

INFILE 'cust_20091120.txt'

BADFILE 'customer.bad'

replace

INTO TABLE t_customerinfo

FIELDS TERMINATED BY "@@"

(customerid,customername,sex,customertype,papertype,paperno,customerclass,industry,status,postlevel,operatorcode,createtime"TO_DATE(:createtime,'yyyy-mm-dd hh24:mi:ss')",remark,busipassword,customerprops,statusupdatetime"TO_DATE(:statusupdatetime,'yyyy-mm-dd hh24:mi:ss')",passwdlevel)

3,customerimp.cmd。批处理文件,执行导入。

sqlldr lzf/lzf@testdb control=customer.ctl





最后,需要提醒的是,在导入之前,表上面最好不要有主键、索引之类的,因为会非常影响速度。

我刚开始没有删除主键、索引,所以速度很慢,删除这些东西后,导入进去120多万条数据,只需要1分多钟。

等到数据全部导入之后,在在表上建主键、索引。
我测试的结果是,120w条数据,建立主键所花费的时间是17秒。

索引则更快些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: