2012-01-26 40 views
0

異なるリモートデータベースのデータを独自のデータベースにロードする必要があります。私はWITH文を使用して単一の "複雑な"クエリを作成します。それは約1800万行のデータです。Oracle:大きなデータセットをテーブルに挿入する

挿入を行う最も効率的な方法は何ですか?

または他の方法があるINTO INSERTを使用して1

  • ずつ挿入カーソルを使用していますか?

  • +0

    いくつかの質問(私は一度に18メートルは、おそらくあなたのマシンが過負荷になると思い)。これは一回限りの運動か定期的な出現ですか?負荷を実行するための時間枠は何ですか?ソースデータベースとターゲットデータベースのレイテンシはどのくらいですか?データベース間の接続の信頼性はどれくらいですか?ソースデータベース内のデータは、静的(アーカイブ)または動的(運用系)ですか?プロセスが途中で失敗した場合(ネットワーク接続を失うなど)、ターゲットデータベースに何を起こしたいですか? – APC

    答えて

    4

    最速の方法は、単一のSQL文を使用することです。次の最も効率的な方法は、BULK COLLECT操作を実行するカーソルを使用して、SQLエンジンとPL/SQLエンジン間のコンテキスト・シフトを最小限にすることです。最も効率的でないアプローチは、カーソルを使用して行ごとにデータを処理することです。

    +0

    ありがとうございます、BULK COLLECTは本当に役に立ちます。^_^ – Ianthe

    0

    1800万行になると、1回の挿入ステートメントでかなりのロールバックが必要になります。ループのカーソルはずっと遅くなりますが、x行ごとにコミットすることができます。

    私は古い学校に行き、sqlldrやデータポンプを介してファイルにダンプします。

    +0

    すべての* x *行をコミットすると、ABENDの後にロード処理を再開するとより多くの作業が行われることに注意してください。また、より広い視線に部分的な負荷を曝露することが意味をなさない場合もある。しかし、私は1800万行が1つのトランザクションをプッシュするのは大変だということに同意します。 – APC

    +0

    また、1800万のインサートでは、考えられる限りのロールバックが生成されません。基本的には1800万行のROWIDと一部のメタデータです。それは、DBAにUNDO表領域のサイズを適切に合わせさせることの問題です。 – APC

    1

    Justinが書いたように、最も効率的なアプローチは、単一のSQL文(insert into ... select ...)を使うことです。また、あなたがdirect-path insert

    0

    を利用することができますあなたはData Synchronisation Studioを使用して、一度に100万を取るために、SELECTステートメントを変更することができ

    関連する問題