使用sql loader使用单个控制文件将多个数据文件加载到多个表中

时间:2013-04-11 13:15:17

标签: oracle shell sql-loader

我需要将数十亿条记录加载到5个不同的表中,这些表中的每一个都有不同的数据文件。这5个表格将每天填充,并在加载新数据前的第二天被截断。

  • Que1:如何使用1个控制文件使用5个不同的数据文件将数据加载到5个不同的表中?
  • Que2:我是否需要5种不同的丢弃,日志和坏文件来跟踪这5种不同的负载?
  • Que3:每天加载数十亿条记录的更好,更有效的方法 - 使用5个不同的控制表,5个丢弃,5个日志文件或只有1个控制表将解决目的。
  • Que4:如果其中一个加载失败,那么我需要再次为所有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

由于 沙

1 个答案:

答案 0 :(得分:0)

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

  1. NOLOGGING - 因为无论如何你每天都在重装
  2. 直接路径 - 你已经在做什么
  3. 并行读取数据文件 - http://docs.oracle.com/cd/B28359_01/server.111/b28319/et_concepts.htm#i1007483
  4. 多个插入
  5. 平行插入
  6. 在已加载的表上没有收集统计​​信息 - 锁定表统计信息而不收集它们并依赖于动态采样。
  7. 如果你绝对必须使用SQL * Loader,那么考虑将数据文件分成多个较小的文件并使用并行直接路径sql * loader会话,但要注意这意味着运行多个sql * loader进程。