2013-04-11 98 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

相關問題