利用大型資料集提升實體框架插入效能
將大型資料集插入實體框架 (EF) 可能會很慢。本文探討了顯著加快此流程的技術,特別是在使用 TransactionScopes 並處理大量記錄時。
最佳化 SaveChanges()
通話
為每筆記錄呼叫 SaveChanges()
的常見做法對於批次插入來說效率很低。 相反,請考慮以下替代方案:
SaveChanges()
:在所有記錄新增到上下文後僅呼叫SaveChanges()
一次。 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 秒
結論
這些策略大大提高了實體框架批次插入效能。停用更改追蹤、使用批次 SaveChanges()
以及有效管理上下文是高效處理大型資料集的關鍵。
以上是處理大型資料集時如何優化實體框架插入以獲得最佳效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!