SQL*Loader在数据加载中的应用

时间:2022-10-01 07:24:22

SQL*Loader在数据加载中的应用

【摘 要】本文详细介绍了SQL*Loader在数据加载中的应用,并对其加载性能进行了简要探讨。SQL*Loader对于加载现成的大块数据入库是非常便捷高效的,对于满足一定格式要求的数据块,只需编写少量命令形成控制文件便可调用sqlldr命令加载数据。通过相应的控制参数,可以显著提高巨量数据加载时的性能。

【关键字】SQL*Loader 数据加载 应用

在向Oracle数据库批量加载数据的时候,通常写一个充满insert语句的脚本文件。这对于大量现成的数据而言,改写成insert语句的工作量巨大的且相当烦琐,而且极易出错,虽然可以编程解决手工insert语句转换问题,但还是比较麻烦。

SQL*Loader数据加载器可以出色地完成这个工作,其原理是自动创建执行数据加载的insert命令。只需对现成的数据文件稍加操作,使之变成标准格式文件,再编写一个文本文件――控制文件,包含要加载的数据格式信息、字段、加载顺序等内容。在加载数据时,根据数据加载的情况,会自动生成日志文件(.log),可能会生成“坏”文件(.bad,当有错误产生时产生)和“废弃”文件(.dsc,当有不满足加载条件数据时产生)。

SQL*Loader一般使用两个文件,一个数据文件,另一个是控制文件。

一、关于数据文件

数据文件是存储SQL*Loader要加载的数据的。数据文件需要满足一定的要求,即要选择一个在加载值中没有出现的分隔符作为字段间分隔标记。因为该分隔符是控制文件判断字段结束的标志,所以一旦在要加载的数据中出现,则被解析成一个字段的结束,产生错误。

常见的数据格式为纯文本文件和Excel文件。尤以Excel文件最多,这种格式的文件通常通过另存为.cvs格式文件加载至数据库,也是最为常用的方法。

二、关于控制文件

控制文件是告诉Oracle如何读取和加载数据的。控制文件控制着数据的加载要求:数据文件在何处、要将数据加载到哪张表和加载中要应用的其他规则。

加载数据可以是定长数据也可以是变长数据。比较灵活和常用的是可变长数据的加载,这就用到了关于数据文件分隔符的要求,因为需要用SQL*Loader命令显示指出字段的结束标志,这样才能正确地将数据读入数据库中。

我们以油田“单井基础信息”表为例说明。目前很多是以Excel格式存储的,需要将其转换成一定标准格式文件,可以以另存为.cvs的方式将其转换为以“,”为分隔符的文件。假定转换生成的文件名为daa01.cvs,放在/usr/testuser目录下,下面编写一个名为daa01.ctl的控制文件。

load data

infile ‘/usr/testuser/daa01.dat’

badfile ‘/usr/testuser/daa01.bad’

append

into table daa01

fields terminated by ‘,’

(JH,CYJH,CYJH1,CYJH2,……)

在选择文件的加载方式时有四种选项:append(以追加方式加载)、insert(用于在空表中插入行,表不为空时则出错)、replace(用于先清空表,再添加新行)、truncate(用于先截断表,再添加新行)。其中truncate方式由于操作后不能回滚,所以在使用时需格外谨慎。

三、如何加载

在Unix/Linux平台使用SQL*Loader时使用sqlldr命令启动,启动时必须指定控制文件名、用户名、口令,其他控制选项均是可选项。以上面的daa01.ctl文件为例说明如下所示:sqlldr testuser/mypassword control=daa01.ctl

若数据文件中有加载失败数据,则会自动生成一个名为daa01.bad的“坏”文件,可以通过查看自动生成的daa01.log文件查找失败原因。

加载完成后,登录Oracle数据库查验:

select * from daa01

刚才谈到SQL*Loader的命令参数问题,我们看到,在加载数据的参数中并未指定数据文件名,那它是如何找到该要加载的数据文件呢?

事实上,除了加载数据所必须的三个参数外,还有一些常用到参数为:data(或datafile,数据文件名,默认值为控制文件名.dat。这就是没有指定这个参数的原因,因为其数据文件名和,控制文件名都是daa01,不同的只是扩展名,所以可以默认不选。);

load(指定要加载的数据行数,默认为全部数据行。);

rows(一次提交的行数,以此值来分解事务的大小。默认为64行,直

接路径加载为全部行。);

silent(加载期间不显示消息);

direct(用直接路径加载方式加载。默认为false。);

skip(在开始加载前在输入文件中要跳过的逻辑行数。一般用于部分加载后加载同一个文件。默认为0);

parallel(用于并行加载。默认为false);

file(用于分配区的文件,在并行加载中使用)。

四、性能问题

SQL*Loader的原理是自动生成insert语句并执行,这样带来的问题是增

加了系统开销,降低系统性能。解决的办法就是上面提到的一个参数――direct,该参数默认状态是false,使用时需将其置为true(direct=true)。其原理是创建预先格式化的数据块,再将其插入数据表中,从而使得加载性能得以提高。

直接路径加载方式比传统加载方式要快。使用parallel同样可以提高效率,该选项将数据加载工作划分为多个进程,以提高加载效率。将被加载表分区也是一个不错提高效率的办法,可以通过执行并发的SQL*Loader进程来对各个分区进行数据加载,显然加载效率大大提高了。

总之,SQL*Loader是一个强大的数据加载工具,可以加载多种格式数据,并可加载跨平台的数据,也支持XML数据的加载。使用简单便捷,是数据库管理员的工作利器。

上一篇:制药企业网络系统安全架构设计 下一篇:乘客用电梯PLC控制