暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL加载程序追加到多个表中

askTom 2015-12-01
162

问题描述

我有两个ctl文件:

$ cat E1.ctl
加载数据
文件“E.DAT”
附加
进入表E
当(1:6)!='页眉'和(1:7)!='尾页'
(
EMP_ID位置(1:10)字符,
EMP_NAME位置(11:60)字符,
DEP_ID位置(61:63)字符
)
进入表E_HEADER
当(1:6) ='标题'
(
动作类型位置(8:10)字符,
日期位置(11:18)日期“YYYYMMDD”
)
进入表E_TRAILER
当(1:7) ='尾部'
(
动作类型位置(8:10)字符,
日期位置(11:18)日期“YYYYMMDD”
)


$ Cat E2.ctl
加载数据
文件“E.DAT”
附加
进入表E
当(1:6)!='页眉'和(1:7)!='尾页'
(
EMP_ID位置(1:10)字符,
EMP_NAME位置(11:60)字符,
DEP_ID位置(61:63)字符
)


我正在尝试使用sqldr插入N个记录,因为“ORA-02291 :违反完整性约束(E_FK)"。
这是预期的行为,尽管我发现当我使用E1.ctl时,它包含“插入到TABLES E_DER AND E_TRAILER”,执行速度变得非常慢。

例如:
要插入64000条记录。
使用E1.ctl的sqldr需要1分钟。
使用E2.ctl的sqldr需要44分钟。


你能帮我了解一下情况吗?




$exec_loader.sh 64000

64000
运行时间为: 00:44:29.94
64000
运行时间为: 00:01:14.98




$cat准备_data.sql


下降表e ;
下降表d ;
删除表e_header ;
拖放表e_tairer ;



创建表d(dep_id number(3),dp_name varchar2(50)) ;

改变表d添加约束d_pk主键(dep_id) ;

创建表e(emp_id number(10),emp_name varchar2(50), dep_id number(3)) ;

改变表e添加约束e_pk主键(emp_id) ;

变更表e添加约束e_fk外键(dep_id)引用d(dep_id) ;


插入到数据中
通过级别<= 100从双连接中选择'D'|| lpad(rownum, 49, 0) ;

插入到e中
通过级别<= 100000 ,从双连接中选择“行号”、“E”|| lpad (行号, 49, 0 )、trunc(dbms_ranom.value (1, 100)) ;


创建表e_header (action_type varchar2(3),ext退出_date date) ;

创建表e_tracker(action_type varchar2(3),ext退出_date date) ;



设置Veri关闭关闭反馈关闭回显关闭页面大小0

线轴E.DAT

选择*

(
选择'标题'||'INS'|| to_char (系统日期,'YYYYMMDD') lin
从 dual
联合
选择lpad(100000+rownum, 10,'') ||'E'|| lpad(rownum, 49, 0 ) || lpad(trunc(100 + dbms_ranom.value (1, 100)),3'') lin
从 dual connect by level <= &1
联合
选择'尾轮'||'INS'|| to_char (系统日期,'YYYYMMDD') lin
从 dual
)
按解码排序( subtr(lin, 1, 1),'H', 1,'T',空, 2 ) ;

退出


$cat Parfile.txt
rows=999999
无声= (标题,反馈)
errors=99999999
bindsize=8192000
readsize=8192000



$cat exec_loader.sh

NUM_rowS=${1}
USERID="xxx/xxx@xxx"


sqlplus ${USEID} @prepare_data ${NUM_RowS} >准备数据.log



sqllldr userid=${USEID} Parfile=parfile.txt bad=E1.bad log=E1.log控件=E1.ctl

grep'ORA-02291'E1.log | wc -l
grep'运行时间为'E1.log



sqllldr userid=${USEID} Parfile=parfile.txt bad=E2. bad log=E2.log控制=E2.ctl

grep'ORA-02291'E2.log | wc -l
grep'运行时间为'E2.log


退出




专家解答

你能澄清一些事情吗?你说

"虽然我发现当我使用E1.ctl时...执行变得如此缓慢"

但在你的内心深处

"E1.ctl的sqldr需要1分钟。
使用E2.ctl的sqldr需要44分钟。”

你说哪个慢? E1还是E2 ?

============

增编:我不认为我需要更多的信息。问题是

当您得到数据库错误(不仅仅是在sqldr中,而是在任何客户机中)时,数据库和客户机需要“重置”,即,使它们自己恢复同步,以便它们可以继续运行。

所以我追踪你的sqldr执行,你看这个:

INSERT INTO E   (EMP_ID,EMP_NAME,DEP_ID) 
VALUES
 (:EMP_ID,:EMP_NAME,:DEP_ID)


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse     3158      0.06       0.07          0          0          0           0
Execute   3158      2.44       2.32          0       6321      73837           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     6316      2.51       2.40          0       6321      73837           0

Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 102  
Number of plan statistics captured: 3

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         0          0          0  LOAD TABLE CONVENTIONAL  E (cr=0 pr=0 pw=0 time=4 us)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net more data from client                3158        0.00          0.03
  SQL*Net break/reset to client                6314        0.02         29.19
  SQL*Net message to client                    3157        0.00          0.00
  SQL*Net message from client                  3157        0.01          2.61
  log file switch (checkpoint incomplete)         1        0.01          0.01
********************************************************************************



因此,在“SQL*Net中断/重置到客户机”中消耗的所有时间-每次都会出现FK错误。

当批量数据加载时,您希望有更少的错误(例如不带FK加载,然后进行验证)。

希望这个能帮上忙。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论