2013-04-11 76 views
0

我有要求将数十亿条记录加载到5个不同的表中,每个表都有不同的数据文件。这5个表格将每天填充并在加载新数据之前在第二天截断。使用sql加载器使用单个控制文件将多个数据文件加载到多个表中

  • Que1:如何使用1个控件使用5个不同的数据文件将数据加载到5个不同的表中?
  • Que2:我需要5种不同的丢弃,日志和坏文件来跟踪这5种不同的负载吗?问题3:每天加载数十亿条记录的更好和有效的方式是什么 - 使用5个不同的控制表,5个丢弃,5个日志文件或者只有1个控制表将解决目的。
  • Que4:如果5个加载中的一个加载失败,那么我需要再次为所有5个表重新运行sqloader?

注意:截止目前我们正在将数据加载到一张表中,但加载需要5-6个小时,所以我们正在寻找更好的性能。 我将从shell脚本运行sqlldr。

有4个不同的数据文件,方含用于1天,7天数据,15天

LOAD DATA 
replace 
INTO TABLE T1_1DAY_STG 
FIELDS TERMINATED BY X'05' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
MM_INTERVAL, 
STRATEGY_ID ,   
AGGREGATE_DATE   date "YYYY-MM-DD" 
) 
INTO TABLE T1_7DAY_STG 
FIELDS TERMINATED BY X'05' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
MM_INTERVAL, 
STRATEGY_ID ,   
AGGREGATE_DATE   date "YYYY-MM-DD" 
) 

我计划的shell脚本这样

echo "start SQL loader" >> ${LOG_FILE} 2>&1 
DCTL=$(eval echo \${TX_SQLLDR_${i}_CTL_SP}) 
DDATA=$(eval echo \${TX_${i}_DATA_FILE_SP}) 
DLOG=$(eval echo \${TX_${i}_DATA_FILE_LOG_SP}) 
DBAD=$(eval echo \${TX_${i}_DATA_FILE_BAD_SP}) 
DDISCARD=$(eval echo \${TX_${i}_DATA_FILE_DISCARD_SP}) 

${ORACLE_HOME}/bin/sqlldr ${ORACLE_USER}/${ORACLE_PASSWD}@${ORACLE_SID} control=${CTL_DIR}/${DCTL} data=${DATA_DIR}/${DDATA} log=${LOG_DIR}/${DLOG} bad=${LOG_DIR}/${DBAD} discard=${LOG_DIR}/${DDISCARD} errors=${ERRNUM} direct=true silent=FEEDBACK > ${TMP_LOG_FILE} 2>&1 

感谢 桑迪

+0

您是否正在从服务器加载文件,如果是[外部表格](http://docs.oracle.com/cd/E11882_01/server.112/e22490/et_concepts.htm)可行的选项? – 2013-04-11 13:22:15

+0

yes数据文件是从netezaa创建的外部表,但我们需要使用sql loader加载数据。 – user2270413 2013-04-11 13:29:50

+0

有4个不同的数据文件1天方含数据,7天,15天LOAD DATA 取代 INTO TABLE T1_1DAY_STG 场TERMINATED BY X'05' OPTIONALLY ENCLOSED BY '“' TRAILING NULLCOLS ( MM_INTERVAL, STRATEGY_ID, AGGREGATE_DATE日期 “YYYY-MM-DD” ) INTO TERMINATED BY X'05' 表T1_7DAY_STG FIELDS OPTIONALLY ENCLOSED BY '“' TRAILING NULLCOLS ( MM_INTERVAL, STRATEGY_ID, AGGREGATE_DATE DAT E “YYYY-MM-DD” ) ( MM_INTERVAL, STRATEGY_ID, AGGREGATE_DATE日期 “YYYY-MM-DD” ) – user2270413 2013-04-11 13:31:36

回答

0

我肯定会查看使用外部表,因为它们更好地支持并行直接路径插入。如果您从多个文件加载并且文件中有一些数据元素允许您确定将要加载数据的表格,则可以使用以下元素以获得最佳性能:

  1. NOLOGGING - - 因为你重装每天反正
  2. 直接的路径 - 这你已经做
  3. 数据文件的并行读取 - http://docs.oracle.com/cd/B28359_01/server.111/b28319/et_concepts.htm#i1007483
  4. 多表插入
  5. 并行插入
  6. 在加载的表上没有收集统计​​信息 - 锁定表统计信息而不收集它们并依赖动态采样。

如果你绝对要使用SQL *装载机然后考虑拆分数据文件分成多个小文件,并使用并行直接路径使用SQL * Loader会话,但要知道,这意味着运行多个SQL * Loader进程。

+0

非常感谢大卫。是的,我必须使用sqlloader,因为你建议它会是多个数据文件和直接路径sql * loader session.Do你认为我在我的第一篇文章中给出的代码将是正确的方式来做到这一点,因为SQL加载器将运行“ 1day“,当它完成时,它会去”7day“,所以一个..不会是多个SQL *加载程序进程在同一时间。我对吗? – user2270413 2013-04-12 10:27:18

+0

我不认为通过相同的SQL * Loader进程运行所有文件将会提高速度。如果您的硬件支持额外的CPU和I/O负载,那么单独运行并且同时运行它们会更快。此外,如果您的硬件支持将每个文件分成多个部分,并将每个文件作为单独的进程加载,则速度会更快。 – 2013-04-12 16:50:15

相关问题