SQL*Loader原理
SQL*Loader是Oracle提供的用于数据加载的一种工具,它比较适合业务分析类型数据库(数据仓库),能处理多种格式的平面文件,批量数据装载比传统的数据插入效率更高。其示意图如下:
控制文件(Control File) (.ctl):用于控制数据导入的行为方式的文件(最重要的文件)
参数文件(可选)(Parameter File) (.par):可以把参数直接写在控制文件里,也可以单独写一个参数文件
数据文件(Data Files) :放置源数据的平面文件(可以一次性导入多个数据文件)
坏文件(Bad File) (.bad):在数据加载时,把无法正确加载的数据放入错误文件中(比如数据格式、数据类型问题等)
丢弃文件(可选)(Discard File) (.dsc):有些数据,虽然数据格式、数据类型没有问题,但它被逻辑条件过滤掉了(由控制文件WHEN设置),会被放入丢失文件
日志文件(Log File) (.log):记录SQL*Loader的数据加载过程
SQL*Loader的数据加载方式
SQL*Loader支持3种数据加载方式,分别是:
- 传统路径加载(direct=false):等同于insert语句
- 直接路径加载(direct=true):绕过SGA,把数据直接导入高水位线(HWM)以上,可设置并行加载,性能比传统路径加载更高,但限制也更多
- 外部表加载(较少用):先为数据文件上创建一个外部表,然后再把数据从外部表insert到目标表中
数据文件的记录格式
从SQL*Loader的角度来看,数据文件里的数据是以记录组织的,分为以下三种记录格式(由控制文件的INFILE参数设置):
定长记录格式
这种方式灵活性最差,但性能却最好,它的语法如下:
INFILE datafile_name "fix n"
表示数据文件里的每个记录定长为n个字节。变长记录格式
INFILE "datafile_name" "var n"
变长记录分为两个部分:记录长度和记录本身,看下面这个例子:load data infile 'example.dat' "var 3" into table example fields terminated by ',' optionally enclosed by '"' (col1 char(5), col2 char(7)) example.dat: 009hello,cd,010world,im, 012my,name is,var 3 表示记录长度为3个字节,紧跟其后的就是记录本身,上例中,第一个记录长度为9个字节(009),值为其后的9个字节(hello,cd,);第二个记录长度为10个字节(010),值为其后的10个字节(world,im, ), 表示第一行行尾的换行符;以此类推。
流记录格式
这是最常用也是默认的记录格式,记录以分隔符分开,其语法如下:
INFILE datafile_name ["str terminator_string"]
分隔符分为两种:
1.
'
char_string
':用单引号或双引号扩起来的字符串
2.X'hex_string
':十六进制的字节字符串。