提升實體框架批次插入效能:策略與基準
有效率地將大型資料集插入實體框架對於避免效能瓶頸至關重要。本文解決了在交易中插入 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()
呼叫並利用上下文處理的批次插入,在實體框架批次插入中實現了顯著的效能提升。這種優化最大限度地降低了事務逾時的風險,並確保活動事務中的高效資料處理。
以上是如何優化實體框架中的批次插入以提高效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!