最近一直在用SQL*LOADER加载数据,用外部表也可以实现,今天想测试下外部表加载数据和SQL*LOADER加载1029027条记录的性能。
首先创建一张外部表。
create table enmo
(name char(10),lname char(10),xname varchar2(50),ydoss varchar2(20),
doss varchar2(50),btime varchar2(50),etime varchar2(50),
num_file number,box_num number,b_enum varchar2(20))
organization external
(type oracle_loader
default directory imp
access parameters
(records delimited by newline
fields terminated by","
(name,lname,xname,ydoss,doss,btime,etime,num_file,box_num,b_enum))
location('doss.csv'));
表已创建。
查看要加载的数据是否正确
SQL> select * from enmo;
select * from enmo
*
第 1 行出现错误:
ORA-29913: 执行 ODCIEXTTABLEFETCH 调出时出错
ORA-30653: 已达到拒绝限制值
这个错误一般都是外部表的数据和外部表的数据类型或字段长度不符,查看日志发现
处理列 NUM_FILE (行 1, 数据文件 d:\imp\doss.csv) 时出错
ORA-01722: 无效数字
这是因为doss.csv的第一行是表的字段名字,和NUMBER类型不符,处理方法可以在第9行下面添加skip=1或者直接讲doss.csv的第一行删除即可,这里直接删除doss.csv的第一行。
SQL> select name,lname,xname,ydoss,doss,btime from enmo where rownum<10;
NAME LNAM XNAME YDOSS DOSS BTIME
------ ---- ---------------------- ----- ---------------- ------------------
内务府 呈稿 掌关防管理内管领事务处 乾关1 05-08-009-000001 乾隆七年九月十八日
内务府 呈稿 掌关防管理内管领事务处 嘉关1 05-08-009-000002 嘉庆元年正月十二日
内务府 呈稿 掌关防管理内管领事务处 嘉关2 05-08-009-000003 嘉庆元年五月初七日
内务府 呈稿 掌关防管理内管领事务处 嘉关3 05-08-009-000004 嘉庆元年七月初二日
内务府 呈稿 掌关防管理内管领事务处 嘉关4 05-08-009-000005 嘉庆元年九月初五日
内务府 呈稿 掌关防管理内管领事务处 嘉关5 05-08-009-000006 嘉庆元年三月十八日
内务府 呈稿 掌关防管理内管领事务处 嘉关6 05-08-009-000007 嘉庆元年二月十九日
内务府 呈稿 掌关防管理内管领事务处 嘉关7 05-08-009-000008 嘉庆元年三月十四日
内务府 呈稿 掌关防管理内管领事务处 嘉关8 05-08-009-000009 嘉庆二年二月初三日
已选择9行。
先测试SQL*LOADER加载需要的时间,首先创建一张和表enmo同构的表。
CREATE TABLE ENMO_01 AS SELECT * FROM ENMO WHERE 1=2;
表已创建。
利用SQL*LOADER加载
C:\Documents and Settings\Administrator>sqlldr stream/stream control=d:\imp\doss.ctl log=d:\imp\doss.log direct=true streamsize=10485760 date_cache=50000
SQL*Loader: Release 11.2.0.1.0 - Production on 星期日 10月 2 22:15:40 2011
Copyright (c) 1982, 2009, Oracle and/or its affiliates.All rights reserved.
加载完成 - 逻辑记录计数 1029027。
参数介绍:
direct=true打开直接路径加载。
streamsize=10485760直接路径加载默认读取全部记录,之后存到流缓冲区,即streamsize,该参数默认256K,这里加大到10M。
date_cache=50000该参数指定一个转换后日期格式的缓冲区,以条为单位,这里指定5000条。
查看日志,加载用时28.82秒
跳过的逻辑记录总数: 0
读取的逻辑记录总数: 1029027
拒绝的逻辑记录总数: 0
废弃的逻辑记录总数: 0
由 SQL*Loader 主线程加载的流缓冲区总数: 227
由 SQL*Loader 加载线程加载的流缓冲区总数: 0
从 星期日 10月 02 22:15:40 2011 开始运行
在 星期日 10月 02 22:16:08 2011 处运行结束
经过时间为: 00: 00: 28.82
CPU 时间为: 00: 00: 04.75
测试外部表加载需要的时间。
SQL> select count(*) from enmo;
COUNT(*)
----------
1029027
SQL> truncate table enmo_01;
表被截断。
SQL> set timing on
SQL> INSERT /*+APPEND*/ INTO ENMO_01 SELECT * FROM ENMO;
已创建1029027行。已用时间: 00: 00: 23.82
SQL> set timing on
SQL> INSERT /*+APPEND*/ INTO ENMO_01 SELECT * FROM ENMO;
已创建1029027行。
已用时间: 00: 00: 23.82
SQL*LOADER加载需要28.82秒,外部表只需要23.82秒。
/*+APPEND*/代表SQL级的直接路径加载,这种方式不写redo,可以减少磁盘I/O。同样都是直径路径,显然利用外部表加载的时间要小于SQL*LOADER加载的时间。
ORACLE公司的工程师黄凯耀曾在EXADATA上利用外部表加载1T的数据,只用可10分钟,当然,他还用到了压缩技术。
我认为用外部表加载更方便,起码在加载前可以非常只管的检查要加载的数据是否正确。
分享到:
相关推荐
SQL*Loader是Oracle数据库导入外部数据的一个工具.它和DB2的Load工具相似,但有更多的选择,它支持变化的加载模式,可选的加载及多表加载.
包含sqlplus、exp、imp、wrc、sqlldr和SDK Package、JDBC Supplement Package...sqlldr: sqlldr 是 Oracle 的 SQL*Loader 工具,用于将外部数据加载到 Oracle 数据库中。它允许你从文本文件、CSV 文件等格式加载数据。
第21章 用SQL*Loader加载数据 第22章 使用Data Pump导入和导出 第23章 访问远程数据 第24章 使用物化视图 第25章 使用Oracle Text进行文本搜索 第26章 使用外部表 第27章 使用回闪查询 第28章 回闪:表和数据库 第Ⅳ...
第23章 用sql*loader 加载数据 第24章 使用data pump export 和data pump import 第25章 访问远程数据 第26章 使用物化视图 第27章 使用oracle text 进行文本搜索 第28章 使用外部表 第29章 使用闪回...
第23章 用sql*loader 加载数据 第24章 使用data pump export 和data pump import 第25章 访问远程数据 第26章 使用物化视图 第27章 使用oracle text 进行文本搜索 第28章 使用外部表 第29章 使用闪回...
第23章 用sql*loader 加载数据 第24章 使用data pump export 和data pump import 第25章 访问远程数据 第26章 使用物化视图 第27章 使用oracle text 进行文本搜索 第28章 使用外部表 第29章 使用闪回...
第23章 用SQL*Loader加载数据 第24章 使用Data Pump Export和Data Pump Import 第25章 访问远程数据 第26章 使用物化视图 第27章 使用Oracle Text进行文本搜索 第28章 使用外部表 第29章 使用闪回查询 第30章 闪问:...
第23章 用SQL*Loader加载数据 第24章 使用Data Pump Export和Data Pump Import 第25章 访问远程数据 第26章 使用物化视图 第27章 使用Oracle Text进行文本搜索 第28章 使用外部表 第29章 使用闪回查询 第30章 闪问:...
SQL*Loader、Data Pump、外部表、Oracle Text、正则表达式都能提供这些功能。然而人们常常会需要在数据库外做一些事情(或者,说得琐碎些,可能您还没有获得必要的数据库权限)。 利用 Python 可以进行高水平的、...
* 比 sql*loader 导入方便一些。 * 可以将大量数据快速导入 Oracle 数据库。 结论 使用 Toad 将 Excel 数据导入 Oracle 是一种简单、快速的数据导入方式,对于项目的开发和测试非常有帮助。通过了解 Toad 的基本...
§1.3.1 SQL和SQL*PLUS的差别 25 §1.3.2 PL/SQL语言 27 §1.4 登录到SQL*PLUS 27 §1.4.1 UNIX环境 27 §1.4.2 Windows NT和WINDOWS/2000环境 29 §1.5 常用SQL*PLUS 附加命令简介 32 §1.5.1 登录到SQL*PLUS 32 §...
§1.3.1 SQL和SQL*PLUS的差别 25 §1.3.2 PL/SQL语言 27 §1.4 登录到SQL*PLUS 27 §1.4.1 UNIX环境 27 §1.4.2 Windows NT和WINDOWS/2000环境 29 §1.5 常用SQL*PLUS 附加命令简介 32 §1.5.1 登录到SQL*PLUS 32 §...
目录回到顶部↑第1章 开发成功的Oracle应用 1 ...15.2.3 使用外部表加载不同的文件 697 15.2.4 多用户问题 697 15.2.5 外部表小结 698 15.3 平面文件卸载 698 15.4 数据泵卸载 708 15.5 小结 710 索引 711
§9.4.2 数据表空间和索引空间分开 99 §9.4.3 回滚段设置 99 §9.4.4 临时表空间设计规划 100 §9.4.5 数据文件和日志文件在不同磁盘上 101 §9.5 数据库物理设计 101 §9.5.1 定量估计 101 §9.5.2 表空间与数据...
目录 序 ..........................................................................................3.4.3 字典管理和本地管理的表空间..................................................186 3.5 临时文件..........
11.5加载器Loader 251 11.6按钮对象SimpleButton 254 11.7文本框TextField 255 11.7.1文本类型 255 11.7.2外观控制 256 11.7.3设置文本 256 11.7.4处理HTML 258 11.7.5输入限制 260 11.7.6文本格式化 260 11.7.7多行...