Entity Framework の一括挿入パフォーマンスの向上: 戦略とベンチマーク
パフォーマンスのボトルネックを回避するには、大規模なデータセットを Entity Framework に効率的に挿入することが重要です。この記事では、トランザクション内に 4000 レコードを挿入するという課題に取り組みます。これは、トランザクションが不完全になりやすいシナリオです。
頻繁な SaveChanges()
通話の落とし穴を避ける
主なパフォーマンスの低下は、レコードごとに SaveChanges()
を繰り返し呼び出すことに起因します。 このアプローチではプロセスが大幅に遅くなります。 最適化する方法は次のとおりです:
1.単一の SaveChanges()
呼び出し: すべてのレコードが追加された後、単一の SaveChanges()
呼び出しを実行します。
2.バッチ化された SaveChanges()
呼び出し: レコードをバッチ (100 または 1000 など) に挿入し、各バッチの後に SaveChanges()
を呼び出します。
3.バッチ化された SaveChanges()
: によるコンテキストの破棄 各 SaveChanges()
呼び出し後の新しいデータベース コンテキストの作成とバッチ処理を組み合わせます。 これによりコンテキストがクリアされ、パフォーマンスがさらに向上します。
最適化された一括挿入パターン:
このコードは、推奨されるアプローチを示しています:
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { using (MyDbContext context = new MyDbContext()) { context.Configuration.AutoDetectChangesEnabled = false; int count = 0; int commitCount = 100; // Adjust as needed foreach (var entity in someCollection) { count++; context.Set<entity>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } context.SaveChanges(); } scope.Complete(); }</code>
パフォーマンス分析:
560,000 のエンティティ (9 つのスカラー プロパティ) を使用したテストでは、次の結果が得られました:
SaveChanges()
(コミット数 1): > 20分SaveChanges()
(コミット数 1000): 242 秒SaveChanges()
をバッチ処理しました (コミット カウント 100): 164 秒結論:
頻繁な SaveChanges()
呼び出しを回避し、コンテキスト破棄を伴うバッチ挿入を利用することにより、Entity Framework の一括挿入で大幅なパフォーマンスの向上が達成されます。この最適化により、トランザクション タイムアウトのリスクが最小限に抑えられ、アクティブなトランザクション内での効率的なデータ処理が保証されます。
以上がパフォーマンスを向上させるために Entity Framework での一括挿入を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。