我需要将数十亿条记录加载到 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
谢谢桑迪