sqlldr加载方式:
直接路径加载--->采用这种模式,SQLLDR不使用SQL;而是直接格式化数据库块,而绕过整个SQL引擎和UNDO生成,同时还可能避开REDO生成
sqlldr较常用的参数:
userid:数据库的连接串
control:控制文件
skip:跳过行或者记录数
rows:每次提交的记录数
bindsize:每次提交记录数缓冲区大小(字节)
direct:"direct=true或direct=y"为直接路径方式导入,通过direct path api发送数据到服务器端的加载引擎,加载引擎按照数据块的格式处理数据并直接写向数据文件,效率较高
parallel:并行(只有在直接路径加载是有效)
skip_index_maintenance:如果源表上存在索引,那么在导入时会产生索引undo数据且索引的块会读进buffer cache,这将影响导入的效率,因为需要花费大量的实践来维护索引,建议在导入时,将索引手动设置为unusable或执行sqlldr命令时加上参数skip_index_maintenance=true即可,待导入结束后,重建索引alter index index_name rebuild nologging
readsize:缓冲区大小(字节),默认1048576
columnarrayrows:指定直接路径加载时流缓冲区的行数,默认5000
streamsize:指定直接路径加载时流缓冲区的大小(字节),默认256000
控制文件:
load data
characterset AL32UTF8
INFILE 'ches.csv'
INSERT
INTO TABLE chen_tmp_txn
[when org = i_org] ----数据刷选
fields terminated by ','
optionally enclosed by '"'
trailing nullcols
(
org char(90),
acq_dt to_date("yyyy-mm-dd"),
sum to_number(:sum ),
txn_date date "yyyy-mm-dd hh24:mi:ss",
con ":id||:name", --表中CON列的值是ID和NAME的组合值
id integer external, -- integer external 表示插入的数据是string,如果只保留integer,表示插入的数据是二进制
name "upper(:name)", --将插入的值转换为大写
)
说明:
1、INFILE后面都是要加载的数据文件,如果用 * 则表示数据就在控制文件内
2、操作类型:
1)insert:默认值,装载空表,如果原先的表有数据,sqlloader会停止
2)append:原先的表有数据 就在表中追加新记录
3)replace:删除旧记录,替换成新装载的记录
4)truncate:删除旧记录,替换成新装载的记录
3、字段分隔符:
1)fields terminated by ',' -----逗号分割
2)fields terminated by '|' -----竖线分割
3)fields terminated whitespace -----空白符分割
4)fields terminated X'09' -----制表符分割
........................................................
4、 1)optionally enclosed by '"' :字段用什么字符包括起来
2)trailing nullcols:字段没有对应的值时允许为空
5、指定字段的数据类型:sqlldr默认字符为char,加载数据时,需根据源数据可表字段的字符型 做相的转换,如acq_dt为date类型,则表示为to_date("yyyy-mm-dd")
执行命令:
sqlldr userid=tiger/tiger123@orcl control=ches.ctl log=ches.log skip=1 direct=true parallel=true skip_index_maintenance=true readsize=1048576 columnarrayrows=10000 streamsize=5126000