大規模なデータセットによる Entity Framework の挿入パフォーマンスの向上
大規模なデータセットを Entity Framework (EF) に挿入すると、時間がかかることがあります。この記事では、特に TransactionScopes を使用して大量のレコードを処理する場合に、このプロセスを大幅に高速化する手法について説明します。
SaveChanges()
通話の最適化
レコードごとに SaveChanges()
を呼び出す一般的な方法は、一括挿入では非効率的です。 代わりに、次の代替案を検討してください:
SaveChanges()
: すべてのレコードがコンテキストに追加された後、SaveChanges()
を 1 回だけ呼び出します。SaveChanges()
: 設定されたレコード数 (例: 100 または 1000) の後で SaveChanges()
を呼び出します。SaveChanges()
を呼び出し、コンテキストを破棄し、一定数のレコードの後に新しいコンテキストを作成します。これらの方法により、データベースのラウンドトリップが削減され、変更追跡によるオーバーヘッドが最小限に抑えられます。
効率的な一括挿入の実装
次のコードは、最適化された一括挿入を示しています。
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { MyDbContext context = null; try { context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; int count = 0; foreach (var entityToInsert in someCollectionOfEntitiesToInsert) { ++count; context = AddToContext(context, entityToInsert, count, 1000, true); } context.SaveChanges(); } finally { if (context != null) context.Dispose(); } scope.Complete(); } private MyDbContext AddToContext(MyDbContext context, Entity entity, int count, int commitCount, bool recreateContext) { context.Set<Entity>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); if (recreateContext) { context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } return context; }</code>
この例では、パフォーマンス向上のために自動変更検出 (AutoDetectChangesEnabled = false
) を無効にします。 AddToContext
メソッドは、変更のコミットを処理し、オプションで指定された数のレコードの後にコンテキストを再作成します。
ベンチマーク結果
560,000 レコードを使用したテストでは劇的な改善が見られました:
SaveChanges()
: 時間
SaveChanges()
100 レコード後: 20 分以上
SaveChanges()
1000 レコード後 (コンテキスト破棄なし): 242 秒
SaveChanges()
1000 レコード後 (コンテキスト破棄あり): 191 秒
結論
これらの戦略により、Entity Framework の一括挿入のパフォーマンスが大幅に向上します。変更追跡を無効にし、バッチ SaveChanges()
を使用し、コンテキストを効果的に管理することが、大規模なデータセットを効率的に処理するための鍵となります。
以上が大規模なデータセットを扱うときにパフォーマンスを最大化するために Entity Framework の挿入を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。