Oracleサーバーが別のマシンにある場合、OracleBulkCopy(ODP.NET)とSQL * Loaderのパフォーマンスに大きな違いが見られます。OracleBulkCopyとSQL * Loaderのパフォーマンス
Oracleには、3つの列(1つのBINARY_FLOAT、2つのNUMBER(18,0))を持つ非常に基本的な表があります。主キー、索引、トリガーなどはありません。ステージング表として使用され、バルク・データをDBに取り込みます。
SQL * Loaderは、表に450万行をロードするのに約27秒かかります。
OracleBulkCopyは、わずか100万行のロードに約10分かかります。
OracleBulkCopyは、ドキュメントによると、「...は、Oracle SQL * Loaderと似ていますが、類似したダイレクト・パス・ロード・アプローチを使用します」* SQL * Loaderパフォーマンスの点では、この違いはばかげています。
ネットワークトラフィックの基本的な分析を行った結果、OracleBulkCopyは膨大な数の小さなパケットを送受信していました。私はWiresharkを使ってパケットを比較し、興味深い結果を見つけました。
SQL * Loaderは - 最初の接続ハンドシェイクの後 - 8キロバイトパケット(TNSプロトコル)の一連を送信し、応答して60バイトのACKを受信します。
てOracleBulkCopyは102バイトパケット(TNSプロトコル)の一連を送信し、応答して133バイトパケット(TNSプロトコル)を受信します。なんて...!それは一度に1つの行を送るようなものです!
OracleBulkCopyクラスでは、バッチ・サイズ100,000を使用しています。データ・ファイルから読み取るには、IDataReaderを使用しています。
だから、私の質問は以下のとおりです。
は、誰もが今までこの動作を見ていますか?
OracleBulkCopyは実際にバルク・ロード・ツールとして機能しますか?
正常に動作するには何か設定が必要ですか? (クライアント/サーバー設定など)
ご協力いただきまして誠にありがとうございます。
私はデータテーブルを使用して同様の挿入時間を持っています。さらに悪いことに、いくつかの列はタイムスタンプ型であるため、データ型列をOracleTimeStamp型に設定する必要があります。この型は、アプリケーションのプロファイルを作成するときに有効です。バルクコピーを高速化できましたか? sqlloaderを実行するためのコマンドラインへの飛び出しは、Webサーバー上の大きなファイルを処理するための本当に貧弱な方法のようです! – Dan