插入实体框架非常慢

时间:2018-05-18 06:39:08

标签: c# sql-server performance entity-framework

我们有一段代码使用lib EntityFramework.BulkInsert-ef6-ext 进行批量插入。 我们面临一些性能问题:完成一些工作+插入数据的整个过程大约需要 150ms 。这看起来很像我的开发者机器,只有我在工作。 我假设在我们的生产服务器上,这个过程要慢得多,因为它上面有很多流量。

我的第一个假设是,当只有几个数据行时,批量插入作为单个插入的速度较慢。

我设置了一个小型测试应用程序,用于跟踪插入过程中的时间。 以下是我的1行结果:

探查:

  1. 批量:cpu(31),读取(1809),持续时间(29)
  2. 单身:cpu(0),读取(13),持续时间(1)
  3. 但是查看我的c#代码中的跟踪时间会显示完全不同的图片:

    批量:85毫秒

    单身:130毫秒

    现在出现两个问题:

    1. 为什么在使用EF进行插入时会产生如此多的开销?如何减少?
    2. 是否有可能使用EF加速单个插入?
    3. 最后这是我的测试代码:

      static void Main(string[] args)
      {
          var sw = new Stopwatch();
          long t1, t2 = 0;
      
          using (var ctx = new TestContext())
          {
              var list = new List<Customer>();
      
              for (int i = 0; i < 1; i++)
              {
                  list.Add(new Customer());
              }
      
              sw.Start();
              ctx.BulkInsert(list);
              ctx.SaveChanges();
          }
      
          sw.Stop();
          t1 = sw.ElapsedMilliseconds;
      
          sw.Reset();
      
          using (var ctx = new TestContext())
          {
              var trx = new TransactionScope();
              ctx.Configuration.LazyLoadingEnabled = false;
              ctx.Configuration.AutoDetectChangesEnabled = false;
              ctx.Configuration.ValidateOnSaveEnabled = false;
              var list = new List<Customer>();
      
              for (int i = 0; i < 1; i++)
              {
                  ctx.Customer.Add(new Customer());
              }
      
              sw.Start();
              ctx.SaveChanges();
              trx.Complete();
              trx.Dispose();
          }
      
          sw.Stop();
          t2 = sw.ElapsedMilliseconds;
      }
      

      最好的问候,Josef

0 个答案:

没有答案