2012-02-02 57 views
8

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は実際にバルク・ロード・ツールとして機能しますか?

  • 正常に動作するには何か設定が必要ですか? (クライアント/サーバー設定など)

ご協力いただきまして誠にありがとうございます。

+0

私はデータテーブルを使用して同様の挿入時間を持っています。さらに悪いことに、いくつかの列はタイムスタンプ型であるため、データ型列をOracleTimeStamp型に設定する必要があります。この型は、アプリケーションのプロファイルを作成するときに有効です。バルクコピーを高速化できましたか? sqlloaderを実行するためのコマンドラインへの飛び出しは、Webサーバー上の大きなファイルを処理するための本当に貧弱な方法のようです! – Dan

答えて

4

Oracle Product ManagerのAlex Keh氏から、「この問題にも気付いていますが、このバグを修正する方法を評価しています」という応答がありました。

私自身の質問に答えて、OracleBulkCopyはではないと思います。はバルクロードツールとしても機能します。少なくとも現時点ではそうではありません。

バグ修正に関するETAがないため、SQL * Loaderを代替ソリューションとしてラップします。

+0

好奇心で、[配列バインディング](http://docs.oracle.com/html/B10961_01/features.htm#1025579)を試しましたか? –

+0

はい、私たちは大部分のデータロードに対して配列バインディングを使用します。しかし、この特定の例では、数千万行のデータをデータベースにロードしており、そのまわりに多くのロジックを必要としません。高速ロードと配列バインディングだけでは十分速くはありません。 –

+0

@AdrianBrown - このスレッドをまだ監視している場合は、どのバージョンが覚えていますか? – Leigh

1

この問題は、DataTableをソースとして使用しているときにも起こりますか?または、それはIDataReaderの使用にのみ起因するのでしょうか?

+0

良い質問です。はい、私もDataTableを使ってみました。私はそれがIDataReaderのストリーミングと関係するかもしれないと思ったが、私はまったく同じ振る舞いをした。それはもっと多くのメモリを使いました。 :) –

関連する問題