gpt4 book ai didi

c# - Entity Framework 6 DbSet AddRange vs IDbSet Add - AddRange 怎么能快这么多?

转载 作者:太空狗 更新时间:2023-10-29 20:06:59 31 4
gpt4 key购买 nike

我在家里的电脑上玩 Entity Framework 6,决定尝试插入相当多的行,大约 430k。

我的第一次尝试是这样的,是的,我知道它可以做得更好,但无论如何都是为了研究:

var watch = System.Diagnostics.Stopwatch.StartNew();
foreach (var event in group)
{
db.Events.Add(event);
db.SaveChanges();
}

var dbCount = db.Events.Count(x => x.ImportInformation.FileName == group.Key);

if (dbCount != group.Count())
{
throw new Exception("Mismatch between rows added for file and current number of rows!");
}

watch.Stop();
Console.WriteLine($"Added {dbCount} events to database in {watch.Elapsed.ToString()}");

晚上开始,下类回家后检查。这是结果:

enter image description here

如您所见,在前 4 小时 41 分钟内添加了 64523 个事件,但随后速度变慢了很多,接下来的 66985 个事件耗时 14 小时 51 分钟。我检查了数据库,程序仍在插入事件,但速度极低。然后我决定尝试"new" AddRange DbSet 的方法。

我将我的模型从 IDbSet 切换到 DbSet 并将 foreach 循环替换为:

db.Events.AddRange(group);
db.SaveChanges();

enter image description here

我现在可以在大约 30 秒内添加 60k+ 个事件。它可能不是 SqlBulkCopy很快,但它仍然是一个巨大的进步。为了实现这一目标,幕后发生了什么?我以为我明天要检查 SQL Server Profiler 查询,但最好能解释一下代码中发生的事情。

最佳答案

正如 Jakub 回答的那样,在每个添加的实体之后调用 SaveChanges 没有帮助。但是即使将其移出,您仍然会遇到一些性能问题。这不会解决由 Add 方法引起的性能问题。

添加与添加范围

使用 Add 方法添加多个实体是一个非常常见的错误。事实上,DetectChanges 方法非常慢。

  • 添加每条记录后的 Add 方法 DetectChanges。
  • 添加所有记录后的 AddRange 方法 DetectChanges。

参见:Entity Framework - Performance Add


It is perhaps not SqlBulkCopy fast, but it is still a huge improvement

有可能获得非常接近 SqlBulkCopy 的性能。

免责声明:我是项目的所有者Entity Framework Extensions

(这个库不是免费的)

此库允许您一次保存多个实体,从而使您的代码更加高效。支持所有批量操作:

  • 批量保存更改
  • 批量插入
  • 批量更新
  • 批量删除
  • 批量合并
  • 批量同步

例子:

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);

// Customize Primary Key
context.BulkMerge(customers, operation => {
operation.ColumnPrimaryKeyExpression =
customer => customer.Code;
});

关于c# - Entity Framework 6 DbSet AddRange vs IDbSet Add - AddRange 怎么能快这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43643685/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com