我需要将数十亿条记录加载到5个不同的表中,这些表中的每一个都有不同的数据文件。这5个表格将每天填充,并在加载新数据前的第二天被截断。
注意:截至目前,我们正在将数据加载到一个表中,但加载需要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 :(得分:0)
我肯定会考虑使用外部表,因为它们更好地支持并行直接路径插入。如果从多个文件加载,并且文件中有一些数据元素允许您确定要将数据加载到哪个表中,那么您可以使用以下元素来获得最佳性能:
如果你绝对必须使用SQL * Loader,那么考虑将数据文件分成多个较小的文件并使用并行直接路径sql * loader会话,但要注意这意味着运行多个sql * loader进程。