繁体   English   中英

使用Entity Framework插入许多行非常慢

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM