質問: ここに示した考え方に基づいて、 `ConcurrentQueue`を`IDataReader`ラップする`QueuedDataReader`を作成しました`QueuedDataReader`これを`SqlBulkCopy`渡して、データベースに「ストリーム」データを渡すことができます。 それは大丈夫、と非常に高速に動作しますが、ログファイルには、私はすべてが提案し実装しましたと信じていても、かなり劇的に成長し、ここで 、 ここでは (および多数の他の場所)。 重要な2つの詳細は次のとおりです。 * 私は並列に数十のテーブルに挿入しています(つまり、テーブルごとに1つの`Task` ) * テーブルには`IDENTITY`カラム(SqlBulkCopyが挿入されていないカラム)があるので、 'SORT'の条件が適切ではないと思います。 それに加えて: * 挿入を開始するとテーブルは空です。 * 私はPRIMARY KEYにCLUSTEREDとNONCLUSTEREDの両方のインデックスを試しましたが、それほど大きな違いはありませんでした。 * 私は`SqlBulkCopyOptions.TableLock`を使用してい`SqlBulkCopyOptions.TableLock` * 私はUseInternalTransactions、およびさまざまなバッチサイズで試しました。 * データベースは単純回復モードです * テーブルにはFK制約がありますが、無効化/再有効化を試みましたが、ログファイルのサイズが大きくなりすぎることはありません(挿入時) 質問: * ログファイルの増加を引き起こす可能性のあるものをトラブルシューティングするために私が見ることができるものは何ですか?
回答: 私の質問を書きながら、私は別の優れたリソースを発見し、ここでの潜在的な原因としてのBatchSizeを指摘し、。 > 結果は非常に驚くべきことです。 BatchSizeパラメータを使用すると、値を低く設定するほどパフォーマンスが悪化し、悪化します。 > > バッチサイズに非常に小さな値を使用すると、ネットワーク帯域幅はプロセス全体の20%以下に抑えられます(500バッチサイズのグラフの上限は他のグラフとは異なります)。 10.000未満の値を指定すると、パフォーマンスが非常に低下し、非常に時間がかかり、ログファイルの使用量が多くなります。 > > バッチサイズが10.000に達すると、さまざまなテストの間の時間の差は非常に小さくなります。しかし、それぞれ750.000行を書き込む8つのスレッドがあるので、各スレッドから75のチャンクしか送信されません。言うまでもなく、BatchSizeとして0を使用し、750.000行全体を1回のバッチで送信すると、最高のパフォーマンスが得られます。 > > パフォーマンスとは別に、BatchSizeパラメータを使用することで利点があるかどうかを調べることは面白いかもしれません。 Books On Lineに記載されているものは見つかっておらず、私たちの経験の中で興味深いものは見られませんでした。これは、BatchSizeで行うのが、デフォルト値であるゼロにすることです。その値と異なる値は、ロードプロセスのパフォーマンスを低下させます。 > > 以前は`BatchSize = 0`をタイムアウトエラーのために放棄していましたが、 `BulkCopyTimeout`をゼロに設定することで、ログファイルの増加はありましたが、これまでよりもはるかに少なくなりました。 **更新** 。あまりにも長い間手動テストをするのをやめてしまった後、私は最終的にBatchSize(0-5000)、エンキューレート、クラスタ化/非クラスタ化インデックスのバリエーションを試して、自動テストスイートを作成しました。 (私の場合は、数十のテーブルに並列にデータを書きます)。 これは私が見つけたものです: * 200000個の挿入のテスト:主キーが`CLUSTERED` **または** BatchSizeがゼロの場合、ログファイルは増加し*ません* 。 * 100万個の挿入のテスト:BatchSize = 0の場合でもログファイルは増加します(他のバッチサイズの場合よりも大幅に少なくなります)。 `CLUSTERED`は、BatchSizeが何であれ、ログの増加を防ぎます。 * これらの条件の外では、すべてが挿入速度に依存します。あまりにも激しく押すと、ログファイルが成長し始めます。 *私のテストでは、IDataReaderでラップされたキューにデータが一定速度で書き込まれます。このキューはBulkInsertによってデキューされます。各テーブルの1つのキュー/ BulkInsert。*次のステップは、より大きなデータセットを試すことです。