0

何十億ものレコードを 5 つの異なるテーブルにロードする必要があり、これらのテーブルにはそれぞれ異なるデータ ファイルがあります。これらの 5 つのテーブルは毎日入力され、翌日新しいデータをロードする前に切り捨てられます。

  • Que1 : 1 つの制御ファイルを使用して 5 つの異なるデータ ファイルを使用して、5 つの異なるテーブルにデータをロードするにはどうすればよいですか?
  • 質問 2: これら 5 つの異なる負荷を追跡するには、5 つの異なる破棄、ログ、および不良ファイルが必要ですか?
  • Que3 : 毎日何十億ものレコードをロードするためのより効率的で効率的な方法は何ですか?
  • Que4: 5 つのロードのうちの 1 つが失敗した場合、5 つのテーブルすべてに対して sqloader を再実行する必要がありますか?

注 : 現在、データを 1 つのテーブルにロードしていますが、ロードに 5 ~ 6 時間かかるため、パフォーマンスの向上を求めています。シェル スクリプトから sqlldr を実行します。

1 日、7 日、15 日のデータを含む 4 つの異なるデータ ファイルがあります。

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"
  )

このようなシェルスクリプトを計画しています

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. DIRECT PATH -- 既に行っている
  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 に答える