[英]Inserting many rows with Entity Framework is extremely slow
我正在使用实体框架来构建数据库。 有两种模式; 工人和技能 。 每个工人都有零个或多个技能 。 我最初将这些数据从某个位置的CSV文件读入内存,然后将其存储在名为allWorkers
的字典中。 接下来,我将数据像这样写入数据库:
// Populate database
using (var db = new SolverDbContext())
{
// Add all distinct skills to database
db.Skills.AddRange(allSkills
.Distinct(StringComparer.InvariantCultureIgnoreCase)
.Select(s => new Skill
{
Reference = s
}));
db.SaveChanges(); // Very quick
var dbSkills = db.Skills.ToDictionary(k => k.Reference, v => v);
// Add all workers to database
var workforce = allWorkers.Values
.Select(i => new Worker
{
Reference = i.EMPLOYEE_REF,
Skills = i.GetSkills().Select(s => dbSkills[s]).ToArray(),
DefaultRegion = "wa",
DefaultEfficiency = i.TECH_EFFICIENCY
});
db.Workers.AddRange(workforce);
db.SaveChanges(); // This call takes 00:05:00.0482197
}
最后一个db.SaveChanges();
我需要五分钟以上的时间来执行,我觉得这太长了。 我在执行调用时运行了SQL Server Profiler,基本上我发现有成千上万的调用:
INSERT [dbo].[SkillWorkers]([Skill_SkillId], [Worker_WorkerId])
VALUES (@0, @1)
有16027行被添加到SkillWorkers
,这是一个相当数量的数据,但不以任何方式巨大。 有什么方法可以优化此代码,因此不需要5分钟的时间来运行?
更新:我已经研究了其他可能的重复项, 例如此重复项,但我认为它们并不适用。 首先,我不是在循环中批量添加任何内容。 我正在一次调用db.SaveChanges();
在将每一行添加到db.Workers
。 这应该是批量插入的最快方法。 其次,我将db.Configuration.AutoDetectChangesEnabled
设置为false
。 现在, SaveChanges()
调用的时间为00:05:11.2273888 (换句话说, 差不多 )。 我认为这并不重要,因为每一行都是新的,因此没有要检测的更改 。
我认为我正在寻找一种发布包含所有16,000技能的UPDATE语句的方法。
一种简单的方法是使用EntityFramework.BulkInsert扩展。
然后,您可以执行以下操作:
// Add all workers to database
var workforce = allWorkers.Values
.Select(i => new Worker
{
Reference = i.EMPLOYEE_REF,
Skills = i.GetSkills().Select(s => dbSkills[s]).ToArray(),
DefaultRegion = "wa",
DefaultEfficiency = i.TECH_EFFICIENCY
});
db.BulkInsert(workforce);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.