问题描述
我有两个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
退出
$ 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执行,你看这个:
因此,在“SQL*Net中断/重置到客户机”中消耗的所有时间-每次都会出现FK错误。
当批量数据加载时,您希望有更少的错误(例如不带FK加载,然后进行验证)。
希望这个能帮上忙。
"虽然我发现当我使用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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




