2011-07-01 12 views
5

私のC#.NETアプリケーションは、OracleBulkCopyを使用して数百万のレコードを一時テーブルに書き込みます。アプリケーションに20000レコード以上のメモリーがあるたびに、OracleBulkCopyを呼び出してすべてを1回のバッチで書き込みます(バッチ・サイズ= 0を使用しています)。最初はテーブルが空で、バッチ全体を書き込むのにわずか2秒かかります。処理中、バッチを書く時間が増加する。レコードが2.000.000になると、各呼び出しにはほぼ25秒かかります。 OracleBulkCopyのデフォルト・オプションを使用しています。テーブルが40.000.000に達したときにいくつかのテストを行うと、20,000レコードを書き込むのに3分ほどかかります。OracleBulkCopyのパフォーマンス

各コールでほぼ一定の時間を維持するために推奨事項があるかどうかを知りたい(私はそれについて何も見つかりませんでした)かどうかを知りたいと思います。私は間違って何かしていますか?

+0

このテーブルにいくつかの挿入トリガーがありますか? – Nate

+1

いいえ、何もありません。主キーでもありません。ロギングを行わないようにテーブルが設定されています。 –

+0

"temp"テーブルは正確に何を意味しますか?グローバル一時テーブル? – DCookie

答えて

3

奇妙な動作のようです。待っているものを見るために挿入を行っているデータベースセッションをトレースしましたか?

ALTER SESSION SET timed_statistics=TRUE; 
ALTER SESSION SET max_dump_file_size=UNLIMITED; 
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; 

100回中に99回、トレース結果は、これらの奇妙な低速ケースの問題を指摘します。

+1

問題はプライマリキーでした。私はテーブルがプライマリキーなしで作成されたと確信していました。トレースファイルを使用して、プライマリキーで何千ものシーケンシャルリードを観察しました。それを除去すると、バッチ当たり0.8秒というほぼ一定の時間が得られた。 –

+0

あなたはそれを見つけてうれしく、SQLトレースはさらに別の問題を発見しました。遅い場合は、SQL Traceを最初に試す必要があります。 –

関連する問題