环境:

服务端:RHEL6.4 + Oracle 11.2.0.4

客户端:WIN10 + Oracle 11.2.0.1 client

目录:

  1. sqlldr语法
  2. sqlldr实验准备
  3. sqlldr常规加载
  4. sqlldr常规加载优化
  5. sqlldr直接路径加载
  6. sqlldr直接路径加载优化
  7. References

1. sqlldr语法

```
用法: SQLLDR keyword=value [,keyword=value,...]

有效的关键字:

userid -- ORACLE 用户名/口令

control -- 控制文件名

log -- 日志文件名

bad -- 错误文件名

data -- 数据文件名

discard -- 废弃文件名

discardmax -- 允许废弃的文件的数目 (全部默认)

skip -- 要跳过的逻辑记录的数目 (默认 0)

load -- 要加载的逻辑记录的数目 (全部默认)

errors -- 允许的错误的数目 (默认 50)

rows -- 常规路径绑定数组中或直接路径保存数据间的行数

(默认: 常规路径 64, 所有直接路径)

bindsize -- 常规路径绑定数组的大小 (以字节计) (默认 256000)

silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)

direct -- 使用直接路径 (默认 FALSE)

parfile -- 参数文件: 包含参数说明的文件的名称

parallel -- 执行并行加载 (默认 FALSE)

file -- 要从以下对象中分配区的文件

skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区 (默认 FALSE)

skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用 (默认 FALSE)

commit_discontinued -- 提交加载中断时已加载的行 (默认 FALSE)

readsize -- 读取缓冲区的大小 (默认 1048576)

external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE (默认 NOT_USED)

columnarrayrows -- 直接路径列数组的行数 (默认 5000)

streamsize -- 直接路径流缓冲区的大小 (以字节计) (默认 256000)

multithreading -- 在直接路径中使用多线程

resumable -- 启用或禁用当前的可恢复会话 (默认 FALSE)

resumable_name -- 有助于标识可恢复语句的文本字符串

resumable_timeout -- RESUMABLE 的等待时间 (以秒计) (默认 7200)

date_cache -- 日期转换高速缓存的大小 (以条目计) (默认 1000)

no_index_errors -- 出现任何索引错误时中止加载 (默认 FALSE)

PLEASE NOTE: 命令行参数可以由位置或关键字指定

。前者的例子是 'sqlldr

scott/tiger foo'; 后一种情况的一个示例是 'sqlldr control=foo

userid=scott/tiger'。位置指定参数的时间必须早于

但不可迟于由关键字指定的参数。例如,

允许 'sqlldr scott/tiger control=foo logfile=log', 但是

不允许 'sqlldr scott/tiger control=foo log', 即使

参数 'log' 的位置正确。

<h1 id="2">2. sqlldr实验准备</h1>
## 2.1 模拟构建导入的源文件 ##

select count(*) from dba_objects;

getobject.sql(利用两表关联无连接条件,由于笛卡儿积产生百万数量级结果集)

select a.owner||',"'||a.object_name||'",'||a.object_id||','||to_char(a.created, 'yyyy-mm-dd hh24:mi:ss')||','||a.status from dba_objects a, (select rownum rn from dual connect by rownum<=20) b;

call.sql

set echo off

set term off

set linesize 140 pagesize 0

set feedback off

set heading off

spool E:\jingyu\scripts\ldr_object.csv

@E:\jingyu\scripts\getobject.sql

spool off

set heading on

set feedback on

set term on

set echo on

SQL调用脚本生成源文件

@E:\jingyu\scripts\call.sql

我这里得到了一个234M大小的ldr_object.csv文件,最后一列有空行,可以考虑先数据清洗后再导入。
## 2.2 创建表 ##

create table objects(

owner varchar2(30),

object_name varchar2(50),

object_id number,

status varchar2(10),

created date

);

create index idx_obj_owner_name on objects(owner, object_name);

## 2.3 控制文件ldr_object.ctl ##

load data

infile "E:\jingyu\scripts\ldr_object.csv"

truncate into table objects

fields terminated by "," optionally enclosed by ' ' TRAILING NULLCOLS

(owner,

object_name,

object_id,

created "to_date(:created,'yyyy-mm-dd hh24:mi:ss')",

status "trim(:status)"

)

这里没有处理源文件的行尾空格,所以用到了trim函数对最后一列进行处理,当然还是建议在加载前就进行源文件的格式处理。
<h1 id="3">3. sqlldr常规加载</h1>

sqlldr jingyu/jingyu@db1 control=E:\jingyu\scripts\ldr_object.ctl bad=E:\jingyu\scripts\ldr_object1.bad log=E:\jingyu\scripts\ldr_object1.log skip=0 errors=9999

对应log文件:

SQL*Loader: Release 11.2.0.1.0 - Production on 星期一 9月 21 10:58:39 2015

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

控制文件: E:\jingyu\scripts\ldr_object.ctl

数据文件: E:\jingyu\scripts\ldr_object.csv

错误文件: E:\jingyu\scripts\ldr_object1.bad

废弃文件: 未作指定

(可废弃所有记录)

要加载的数: ALL

要跳过的数: 0

允许的错误: 9999

绑定数组: 64 行, 最大 256000 字节

继续: 未作指定

所用路径: 常规

表 OBJECTS,已加载从每个逻辑记录

插入选项对此表 TRUNCATE 生效

TRAILING NULLCOLS 选项生效

列名 位置 长度 中止 包装数据类型


OWNER FIRST * , O ( ) CHARACTER

OBJECT_NAME NEXT * , O ( ) CHARACTER

OBJECT_ID NEXT * , O ( ) CHARACTER

CREATED NEXT * , O ( ) CHARACTER

列的 SQL 串: "to_date(:created,'yyyy-mm-dd hh24:mi:ss')"

STATUS NEXT * , O ( ) CHARACTER

列的 SQL 串: "trim(:status)"

表 OBJECTS:

1731340 行 加载成功。

由于数据错误, 0 行 没有加载。

由于所有 WHEN 子句失败, 0 行 没有加载。

由于所有字段都为空的, 0 行 没有加载。

为绑定数组分配的空间: 82560 字节 (64 行)

读取 缓冲区字节数: 1048576

跳过的逻辑记录总数: 0

读取的逻辑记录总数: 1731340

拒绝的逻辑记录总数: 0

废弃的逻辑记录总数: 0

从 星期一 9月 21 10:58:39 2015 开始运行

在 星期一 9月 21 11:12:20 2015 处运行结束

经过时间为: 00: 13: 41.34

CPU 时间为: 00: 01: 51.13

13分41秒加载完成1731340记录数。
<h1 id="4">4. sqlldr常规加载优化</h1>

sqlldr jingyu/jingyu@db1 control=E:\jingyu\scripts\ldr_object.ctl bad=E:\jingyu\scripts\ldr_object2.bad log=E:\jingyu\scripts\ldr_object2.log skip=0 errors=9999 rows=5000 bindsize=20971520 readsize=20971520

对应log文件:

SQL*Loader: Release 11.2.0.1.0 - Production on 星期一 9月 21 11:17:26 2015

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

控制文件: E:\jingyu\scripts\ldr_object.ctl

数据文件: E:\jingyu\scripts\ldr_object.csv

错误文件: E:\jingyu\scripts\ldr_object2.bad

废弃文件: 未作指定

(可废弃所有记录)

要加载的数: ALL

要跳过的数: 0

允许的错误: 9999

绑定数组: 5000 行, 最大 20971520 字节

继续: 未作指定

所用路径: 常规

表 OBJECTS,已加载从每个逻辑记录

插入选项对此表 TRUNCATE 生效

TRAILING NULLCOLS 选项生效

列名 位置 长度 中止 包装数据类型


OWNER FIRST * , O ( ) CHARACTER

OBJECT_NAME NEXT * , O ( ) CHARACTER

OBJECT_ID NEXT * , O ( ) CHARACTER

CREATED NEXT * , O ( ) CHARACTER

列的 SQL 串: "to_date(:created,'yyyy-mm-dd hh24:mi:ss')"

STATUS NEXT * , O ( ) CHARACTER

列的 SQL 串: "trim(:status)"

表 OBJECTS:

1731340 行 加载成功。

由于数据错误, 0 行 没有加载。

由于所有 WHEN 子句失败, 0 行 没有加载。

由于所有字段都为空的, 0 行 没有加载。

为绑定数组分配的空间: 6450000 字节 (5000 行)

读取 缓冲区字节数:20971520

跳过的逻辑记录总数: 0

读取的逻辑记录总数: 1731340

拒绝的逻辑记录总数: 0

废弃的逻辑记录总数: 0

从 星期一 9月 21 11:17:26 2015 开始运行

在 星期一 9月 21 11:19:43 2015 处运行结束

经过时间为: 00: 02: 17.92

CPU 时间为: 00: 00: 35.25

加载速度从13分41秒提升到2分17秒。因为默认一次加载从64行改为5000行,同时增大了bindsize的值为20971520(20M),实际5000行使用了6M左右的空间,所以表数据量大的情况下,还可以继续加大rows的参数值,具体效率提升情况还是需要具体的测试才可以最终选择合适的值。

<h1 id="5">5. sqlldr直接路径加载</h1>

sqlldr jingyu/jingyu@db1 control=E:\jingyu\scripts\ldr_object.ctl bad=E:\jingyu\scripts\ldr_object3.bad log=E:\jingyu\scripts\ldr_object3.log skip=0 errors=9999 rows=10000 direct=true

对应log文件:

SQL*Loader: Release 11.2.0.1.0 - Production on 星期一 9月 21 11:33:10 2015

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

控制文件: E:\jingyu\scripts\ldr_object.ctl

数据文件: E:\jingyu\scripts\ldr_object.csv

错误文件: E:\jingyu\scripts\ldr_object3.bad

废弃文件: 未作指定

(可废弃所有记录)

要加载的数: ALL

要跳过的数: 0

允许的错误: 9999

继续: 未作指定

所用路径: 直接

表 OBJECTS,已加载从每个逻辑记录

插入选项对此表 TRUNCATE 生效

TRAILING NULLCOLS 选项生效

列名 位置 长度 中止 包装数据类型


OWNER FIRST * , O ( ) CHARACTER

OBJECT_NAME NEXT * , O ( ) CHARACTER

OBJECT_ID NEXT * , O ( ) CHARACTER

CREATED NEXT * , O ( ) CHARACTER

列的 SQL 串: "to_date(:created,'yyyy-mm-dd hh24:mi:ss')"

STATUS NEXT * , O ( ) CHARACTER

列的 SQL 串: "trim(:status)"

表 OBJECTS 的以下索引已处理:

索引 JINGYU.IDX_OBJ_OWNER_NAME 已成功加载, 具有 1731340 个关键字

表 OBJECTS:

1731340 行 加载成功。

由于数据错误, 0 行 没有加载。

由于所有 WHEN 子句失败, 0 行 没有加载。

由于所有字段都为空的, 0 行 没有加载。

在直接路径中没有使用绑定数组大小。

列数组 行数: 5000

流缓冲区字节数: 256000

读取 缓冲区字节数: 1048576

跳过的逻辑记录总数: 0

读取的逻辑记录总数: 1731340

拒绝的逻辑记录总数: 0

废弃的逻辑记录总数: 0

由 SQLLoader 主线程加载的流缓冲区总数: 581

由 SQL
Loader 加载线程加载的流缓冲区总数: 669

从 星期一 9月 21 11:33:10 2015 开始运行

在 星期一 9月 21 11:35:24 2015 处运行结束

经过时间为: 00: 02: 13.92

CPU 时间为: 00: 00: 23.92

sqlldr直接路径加载速度提升到2分13秒。
**注意:**直接路径加载过程中,索引会变成unusable状态,加载完成后变为valid状态。

直接路径加载过程中,查看索引状态为UNUSABLE。

SQL> select table_name, index_name, status from user_indexes where table_name='OBJECTS';

TABLE_NAME INDEX_NAME STATUS


OBJECTS IDX_OBJ_OWNER_NAME UNUSABLE

直接路径加载完成,查看索引状态为VALID。

SQL> select table_name, index_name, status from user_indexes where table_name='OBJECTS';

TABLE_NAME INDEX_NAME STATUS


OBJECTS IDX_OBJ_OWNER_NAME VALID


<h1 id="6">6. sqlldr直接路径加载优化</h1>
针对streamsize,date_cache两个参数,参数具体含义见第一部分的帮助。

sqlldr jingyu/jingyu@db1 control=E:\jingyu\scripts\ldr_object.ctl bad=E:\jingyu\scripts\ldr_object4.bad log=E:\jingyu\scripts\ldr_object4.log skip=0 errors=9999 rows=10000 direct=true streamsize=10485760 date_cache=5000

对应log文件:

SQL*Loader: Release 11.2.0.1.0 - Production on 星期一 9月 21 11:58:35 2015

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

控制文件: E:\jingyu\scripts\ldr_object.ctl

数据文件: E:\jingyu\scripts\ldr_object.csv

错误文件: E:\jingyu\scripts\ldr_object4.bad

废弃文件: 未作指定

(可废弃所有记录)

要加载的数: ALL

要跳过的数: 0

允许的错误: 9999

继续: 未作指定

所用路径: 直接

表 OBJECTS,已加载从每个逻辑记录

插入选项对此表 TRUNCATE 生效

TRAILING NULLCOLS 选项生效

列名 位置 长度 中止 包装数据类型


OWNER FIRST * , O ( ) CHARACTER

OBJECT_NAME NEXT * , O ( ) CHARACTER

OBJECT_ID NEXT * , O ( ) CHARACTER

CREATED NEXT * , O ( ) CHARACTER

列的 SQL 串: "to_date(:created,'yyyy-mm-dd hh24:mi:ss')"

STATUS NEXT * , O ( ) CHARACTER

列的 SQL 串: "trim(:status)"

表 OBJECTS 的以下索引已处理:

索引 JINGYU.IDX_OBJ_OWNER_NAME 已成功加载, 具有 1731340 个关键字

表 OBJECTS:

1731340 行 加载成功。

由于数据错误, 0 行 没有加载。

由于所有 WHEN 子句失败, 0 行 没有加载。

由于所有字段都为空的, 0 行 没有加载。

在直接路径中没有使用绑定数组大小。

列数组 行数: 5000

流缓冲区字节数:10485760

读取 缓冲区字节数: 1048576

跳过的逻辑记录总数: 0

读取的逻辑记录总数: 1731340

拒绝的逻辑记录总数: 0

废弃的逻辑记录总数: 0

由 SQLLoader 主线程加载的流缓冲区总数: 581

由 SQL
Loader 加载线程加载的流缓冲区总数: 0

从 星期一 9月 21 11:58:35 2015 开始运行

在 星期一 9月 21 12:00:42 2015 处运行结束

经过时间为: 00: 02: 07.63

CPU 时间为: 00: 00: 29.36

速度提升到2分7秒。
<h1 id="7">References</h1>
- 涂抹 Oracle[M]. 中国水利水电出版社, 2010.

Oracle数据加载之sqlldr工具的介绍的更多相关文章

  1. Oracle数据加载之外部表的介绍

    环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 目录: 一. 创建外部表 1.1 创建外部表需要的目录 1.2 创建外部表 1.3 创建外部表源文件 1.4 查询外部表 二. 加载 ...

  2. 7. Oracle数据加载和卸载

    在日常工作中:经常会遇到这样的需求: Oracle 数据表跟文本或者文件格式进行交互:即将指定文件内容导入对应的 Oracle 数据表中:或者从 Oracle 数据表导出. 其他数据库中的表跟Orac ...

  3. Oracle数据加载和卸载

    一. 平面文件卸载数据泵卸载 EXP/IMP; EXPDP/IMPDP sqlldr的两种模式:传统路径直接路径 控制文件:INSERT.APPEND.TRUNCATE.REPLACE 1.定界数据2 ...

  4. odoo基础数据加载

    odoo 基础数据加载 这里介绍的odoo基础数据加载分两种方式,一种是演示数据加载,一种是默认数据加载,下面就是详细介绍 首先,当然是创建一个date文件夹 项目目录,右键自定义一个文件夹 XML数 ...

  5. Oracle sqlldr数据加载

    1 sqlldr 传统路径:sqlldr会利用sql插入为我们加载数据 直接路径加载:sqlldr不适用sql,直接格式化数据块,绕开undo,避开redo,最快的方法就是并行直接路径加载 sqlld ...

  6. PostgreSQL数据加载工具之pg_bulkload

    1. 介绍 PostgreSQL提供了一个copy命令的便利数据加载工具,copy命令源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.pg_bulkload ...

  7. MPP 二、Greenplum数据加载

    Loading external data into greenplum database table using different ways... Greenplum 有常规的COPY加载方法,有 ...

  8. flask+sqlite3+echarts3+ajax 异步数据加载

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

  9. 浅谈Entity Framework中的数据加载方式

    如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...

随机推荐

  1. 使用TSQL查询和更新 JSON 数据

    JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...

  2. .NET 提升教育 第一期:VIP 付费课程培训通知!

    为响应 @当年在远方 同学的建议,在年前尝试进行一次付费的VIP培训. 培训的课件:点击下载培训周期:10个课程左右,每晚1个半小时培训价格:1000元/人.报名方式:有意向的请加QQ群:路过秋天.N ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(71)-微信公众平台开发-公众号管理

    系列目录 思维导图 下面我们来看一个思维导图,这样就可以更快了解所需要的功能: 上一节我们利用了一个简单的代码例子,完成了与微信公众号的对话(给公众号发一条信息,并得到回复) 这一节将讲解公众号如何设 ...

  4. Kooboo CMS技术文档之二:Kooboo CMS的安装步骤

    在IIS上安装Kooboo CMS Kooboo CMS安装之后 安装的常见问题 1. 在IIS上安装Kooboo CMS Kooboo CMS部署到正式环境相当简单,安装过程是一个普通MVC站点在I ...

  5. zookeeper源码分析之二客户端启动

    ZooKeeper Client Library提供了丰富直观的API供用户程序使用,下面是一些常用的API: create(path, data, flags): 创建一个ZNode, path是其 ...

  6. 原生javascript 固定表头原理与源码

    我在工作中需要固定表头这个功能,我不想去找,没意思.于是就写了一个,我写的是angularjs 自定义指令 起了个 "fix-header" ,有人叫  "freeze- ...

  7. RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密

    最近换了一份工作,工作了大概一个多月了吧.差不多得有两个月没有更新博客了吧.在新公司自己写了一个iOS的比较通用的可以架构一个中型应用的不算是框架的一个结构,并已经投入使用.哈哈 说说文章标题的相关的 ...

  8. Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)

    昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...

  9. ios 类似微信红点显示功能

    设计思路:给UIView增加一个分类 所有的视图都可以根据需要来进行红点显示 #import <UIKit/UIKit.h> @interface UIView (CHRRedDot) @ ...

  10. Spark-shell和Spark-Submit的使用

    Spark-shell有两种使用方式: 1:直接Spark-shell 会启动一个SparkSubmit进程来模拟Spark运行环境,是一个单机版的. 2:Spark-shell --master S ...