0

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

  • Que1:如何使用 1 个控制文件使用 5 个不同的数据文件将数据加载到 5 个不同的表中?
  • Que2:我是否需要 5 个不同的丢弃、日志和坏文件来跟踪这 5 个不同的负载?
  • Que3:每天加载数十亿条记录的更好和更有效的方法 - 使用 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

谢谢桑迪

4

1 回答 1

0

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

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

如果您绝对必须使用 SQL*Loader,请考虑将数据文件拆分为多个较小的文件并使用并行直接路径 sql*loader 会话,但请注意,这意味着运行多个 sql*loader 进程。

于 2013-04-11T13:50:29.253 回答