詳細を要約すると、約500万行をベンダー(Oracle)データベースにステージングする必要があります。OracleBulkCopy
(ODP.NET)を使用して50万行のバッチですべてがうまくいきますが、5Mにスケールアップしようとすると、1Mマークに達するとパフォーマンスが低下してクロールになり、行がロードされるにつれて徐々に遅くなり、最終的には3時間程度でタイムアウトします。
テーブルの主キーに関連していると思われますが、情報と私が読んでいる多くのことのためにOracleフォーラムとStack Overflowを探し回っています(また、多くの投稿が互いに矛盾しているようです) 。私は誰かがプロセスに関するいくつかの密接に関連した質問にまっすぐに記録を立てることができることを望んでいます:
ない
OracleBulkCopy
クラスは、従来の、またはダイレクト・パス・ロードを使用しますか?何らかの方法でこれを確認できますか?仮定すると、それはありません使用ダイレクト・パス・ロード:それはOracleが自動的にロードおよびプットバックオンラインその後、それらの間に使用不可能にすべてのインデックスを設定していることは本当ですか?私はこの効果に関するいくつかの声明を読みましたが、繰り返しますが、確認することはできません。
#2がtrueの場合、一括コピー操作を開始する前に、テーブルにどのインデックスが存在するか違いがありますか?もしそうなら、なぜですか?
#3に関連して、一般に、使用できないインデックスを使用したバルクロードと、ロードの前に実際にインデックスを削除してから再作成する間に、実際的な違いはありますか?
#2が正しくない場合、または理解していないいくつかの警告がある場合、バルクロードの前に明示的にインデックスを使用不可にし、その後 明示的に再構築することは違いがありますか?
インデックスビルド以外に、レコードが追加されるにつれて一括コピー操作が徐々に遅くなる原因はありますか?(たぶん、ロギングと関係がありますが、バルク操作はログに記録されないと思われますか?)
最初にPK /インデックスを削除する以外にパフォーマンスを完全に向上させる方法が他にない場合、インデックスが完全に消えないようにするためにどのような手順を実行できますか。つまり、データベースへの接続が失われた場合プロセスの途中?