Oracle数据加载之sqlldr工具的介绍
环境:
服务端:RHEL6.4 + Oracle 11.2.0.4
客户端:WIN10 + Oracle 11.2.0.1 client
目录:
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
由 SQLLoader 加载线程加载的流缓冲区总数: 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
由 SQLLoader 加载线程加载的流缓冲区总数: 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工具的介绍的更多相关文章
- Oracle数据加载之外部表的介绍
环境: 服务端:RHEL6.4 + Oracle 11.2.0.4 目录: 一. 创建外部表 1.1 创建外部表需要的目录 1.2 创建外部表 1.3 创建外部表源文件 1.4 查询外部表 二. 加载 ...
- 7. Oracle数据加载和卸载
在日常工作中:经常会遇到这样的需求: Oracle 数据表跟文本或者文件格式进行交互:即将指定文件内容导入对应的 Oracle 数据表中:或者从 Oracle 数据表导出. 其他数据库中的表跟Orac ...
- Oracle数据加载和卸载
一. 平面文件卸载数据泵卸载 EXP/IMP; EXPDP/IMPDP sqlldr的两种模式:传统路径直接路径 控制文件:INSERT.APPEND.TRUNCATE.REPLACE 1.定界数据2 ...
- odoo基础数据加载
odoo 基础数据加载 这里介绍的odoo基础数据加载分两种方式,一种是演示数据加载,一种是默认数据加载,下面就是详细介绍 首先,当然是创建一个date文件夹 项目目录,右键自定义一个文件夹 XML数 ...
- Oracle sqlldr数据加载
1 sqlldr 传统路径:sqlldr会利用sql插入为我们加载数据 直接路径加载:sqlldr不适用sql,直接格式化数据块,绕开undo,避开redo,最快的方法就是并行直接路径加载 sqlld ...
- PostgreSQL数据加载工具之pg_bulkload
1. 介绍 PostgreSQL提供了一个copy命令的便利数据加载工具,copy命令源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.pg_bulkload ...
- MPP 二、Greenplum数据加载
Loading external data into greenplum database table using different ways... Greenplum 有常规的COPY加载方法,有 ...
- flask+sqlite3+echarts3+ajax 异步数据加载
结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...
- 浅谈Entity Framework中的数据加载方式
如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...
随机推荐
- Android UI体验之全屏沉浸式透明状态栏效果
前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...
- [Java 缓存] Java Cache之 DCache的简单应用.
前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...
- 【.net 深呼吸】程序集的热更新
当一个程序集被加载使用的时候,出于数据的完整性和安全性考虑,程序集文件(在99.9998%的情况下是.dll文件)会被锁定,如果此时你想更新程序集(实际上是替换dll文件),是不可以操作的,这时你得把 ...
- 转:聊聊mavenCenter和JCenter
Gradle支持从maven中央仓库和JCenter上获取构件,那这两者有什么区别呢? maven中央仓库(http://repo1.maven.org/maven2/)是由Sonatype公司提供的 ...
- Hawk 4.4 执行器
执行器是负责将Hawk的结果传送到外部环境的工具.你可以写入数据表,数据库,甚至执行某个特定的动作,或是生成文件等等. 在调试模式下,执行器都是不工作的.这是为了避免产生副作用.否则,每刷新一遍数据, ...
- Oracle 数据库知识汇总篇
Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...
- jsp页面无法识别el表达式的解决方案
今天在写一个springmvc的小demo时,碰到一个问题,在jsp页面中书写为${user.username}的表达式语言,在浏览器页面中仍然显示为${user.username},说明jsp根本不 ...
- 通过AngularJS实现前端与后台的数据对接(一)——预备工作篇
最近,笔者在做一个项目:使用AngularJS,从而实现前端与后台的数据对接.笔者这是第一次做前端与后台的数据对接的工作,因此遇到了许多问题.笔者在这些问题中,总结了一些如何实现前端与后台的数据对接的 ...
- VS2015在创建项目时的一些注意事项
一.下面是在创建一个新的项目是我最常用的,现在对他们一一做一个详细的介绍: 1.Win32控制台应用程序我平时编写小的C/C++程序都用它,它应该是用的最多的. 2.名称和解决方案名称的区别:名称是项 ...
- 内存映射文件MemoryMappedFile使用
参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...