利用大型数据集提升实体框架插入性能
将大型数据集插入实体框架 (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中文网其他相关文章!