バルクロードのパフォーマンスを向上させるために取り組んでいます。毎日何百万件ものレコードが100件あります。SqlBulkCopyのパフォーマンス
これをデータテーブルの代わりにIDatareader
インターフェイスを使用するように変更し、パフォーマンスが大幅に向上しました(1分あたり50万レコード増加)。現在の設定は次のとおりです。
- 区切られたファイルを解析するカスタムキャッシュリーダーです。
- ストリームリーダーをバッファリングされたストリームにラップします。
- オブジェクトを列挙し、
IDatareader
インターフェイスを実装するカスタムオブジェクトリーダークラスです。 - その後
SqlBulkCopy
は、パフォーマンスのボトルネックの大部分はSqlBulkCopy.WriteToServer
に直接あるサーバー に
を書き込みます。私がユニットテストを行う場合には、WriteToServer
だけを除いて、約1分でプロセスが戻ります。 WriteToServer
はさらに15分以上かかる。単体テストの場合、ローカルマシン上にあるので、データベースが同じドライブ上にあるため、ネットワークを介してデータをコピーする必要はありません。
ヒープテーブルを使用しています(インデックスはありません、クラスター化されているか、クラスター化されていない、パフォーマンスに大きな違いはなく、さまざまなバッチサイズで使用しています)。
負荷時間を減らす必要があるので、誰かが今このターンアップからもう少し血を絞る方法を望んでいると思っています。
あなたはリリースモードを実行していますか?ビットとは何ですか?プロファイリングしましたか? 15分以上の間に、CPU負荷は主にサーバーまたはクライアントに負荷されますか?どのくらいのデータを実際にコピーしていますか?一括コピーにはどのような設定を使用しましたか?コピー中のI/O負荷は何ですか? –
はい、これはリリースモードです。 32私のローカルで私はユニットテストです。クライアントはdbと同じボックスで実行されています。プロセスの約12%のCPU使用量と80Kのメモリを安定して保持します。このユニットは1200万レコードをテストします。私はテーブルロック設定を使用しました。良いアイデア、私はこのプロセスでSQLプロファイラを実行し、何かを変えるかどうかを確認します。 –
クライアントプロセスとサーバープロセスのCPU負荷を意味します。あなたはここではSQLプロファイラ以上のことを伝えるかもしれないクライアント用のCPUプロファイラを見るべきです - SQL側が非常にシンプルな(それは良い)と聞こえます。 12%のCPU負荷 - それは8コアマシンの1コアが限界に達した可能性がありますか? 1レコードは何バイトですか?ああ、最後に、デバッガを接続せずに実行していますか(リリースモードでも可能です)。 –