このアプリでは、大量のテキストを SQL Server 2005 データベースに追加する必要があります (1 つのレコードで最大 1 GB)。パフォーマンス上の理由から、これはチャンクごとにストアド プロシージャ コールを行うことによってチャンクで行われます (たとえば、usp_AddChunk)。usp_AddChunk には明示的なトランザクションはありません。
私が見ているのは、チャンク サイズを 100MB から 10MB に減らすと、トランザクション ログが非常に大きくなるということです。これは、usp_AddChunk が呼び出されるたびに、"暗黙的" (私の用語) トランザクションが既存のテキストをすべてログに記録するためだと言われています。したがって、150MB のレコードの場合:
100MB のチャンク サイズ: 100 (0 バイトのログ) + 50 (100 MB のログ) = 100 MB のログ
よりも小さくなる
10 MB のチャンク サイズ: 10 (0 バイトのログ) + 10 (10 MB のログ) + 10 (20 MB のログ) ... + 10 (140 MB のログ) = 1050 MB のログ
C# コードで (最初のチャンクを追加する前に、最後のチャンクの後にコミットする前に) トランザクションを開くことで、この「暗黙の」トランザクションは発生せず、巨大なログ ファイルを回避できると考えました。しかし、私のテストでは、ADO.NET トランザクションを使用すると、トランザクション ログが 5 倍大きくなることがわかりました。
コードは掲載しませんが、詳細は次のとおりです。
- SqlConnection.BeginTransaction() を呼び出します
- チャンクごとに異なる SqlCommand を使用します
- (1) の SqlTransaction を各 SqlCommand に割り当てます
- 通常、SqlCommand を実行するたびに接続を閉じますが、同じ結果で接続を閉じないようにしました
このスキームの欠陥は何ですか?さらに情報が必要な場合はお知らせください。ありがとう!
注: シンプルまたは一括ログ復旧モデルの使用はオプションではありません