【问题标题】:entity framework save taking a long time实体框架保存需要很长时间
【发布时间】:2014-08-13 16:19:34
【问题描述】:

这里有很多关于 EF 的文章需要很长时间才能保存,但我浏览了它们并使用了他们的答案,但似乎仍然得到非常缓慢的结果。

我的代码如下所示:

using (MarketingEntities1 db = new MarketingEntities1())
        {
            //using (var trans = db.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
            //{
                int count = 0;
                db.Configuration.AutoDetectChangesEnabled = false;
                db.Configuration.ValidateOnSaveEnabled = false;
                while (count < ranges.Count)
                {
                    if (bgw != null)
                    {
                        bgw.ReportProgress(0, "Saving count: " + count.ToString());
                    }
                    db.Set<xGeoIPRanx>().AddRange(ranges.Skip(count).Take(BATCHCOUNT));
                    db.SaveChanges();
                    count+=BATCHCOUNT;

                }
                //trans.Commit();
            //}
        }

每批需要 30 多秒才能完成。 BatchCount 是 1000。我知道 EF 并没有那么慢。你可以看到我已经停止使用事务,我已经取消了跟踪,似乎都没有帮助。

更多信息:

xGeoIpRanx 是一个空表,没有 PK(我不确定它有多大帮助)。我正在尝试插入大约 1000 万个范围。

编辑:

我觉得很愚蠢,但我尝试使用 bulkInsert 并且我不断收到此实体不存在错误,我查看此代码

using (var ctx = GetContext())
{
  using (var transactionScope = new TransactionScope())
  {
    // some stuff in dbcontext

    ctx.BulkInsert(entities);

    ctx.SaveChanges();
    transactionScope.Complete();
  }
}

什么是“实体”我尝试了我的实体列表,但不起作用,那是什么数据类型?

nvm 它按预期工作,由于我生成 edmx 文件的方式,这是一个奇怪的错误

【问题讨论】:

  • 好吧,分析应用程序以查看需要时间的内容。可以是任何东西。在负载下暂停调试器 10 次,并查看包括外部代码在内的堆栈。它最常停在哪里?我不明白为什么批处理会在这里改善任何事情。对所有事情都使用一批。
  • 您的数据库服务器和 Web 服务器在同一个本地网络上吗?如果您从本地工作站进行调试,并且 SQL 服务器在数据中心的异地,那么这将非常慢。 EF 是“健谈”的,因为它会执行很多小的 SQL 语句,因此延迟将是一个问题。
  • @usr 它在 .SaveChanges() 上花费了很长时间我也将它批处理以进行调试,以查看它是否正在保存。
  • @Mangist 它不在现场,我们通过 vpn 连接到它
  • 我会用EntityFramework.BulkInsert 它超级快

标签: c# entity-framework


【解决方案1】:

在负载下暂停调试器 10 次并查看堆栈,包括 外部代码。它最常停在哪里?

.

.SaveChanges() 需要很长时间。只是来自一些快速测试,ADO.net 代码

这意味着网络延迟和服务器执行时间是造成这种情况的原因。对于插入服务器的执行时间通常不会那么高。您无法对 EF 的网络延迟做任何事情,因为它每次插入发送一批。 (是的,这是框架的缺陷。)。

不要将 EF 用于批量工作。考虑使用表值参数或SqlBulkCopy 或任何其他批量插入方式,例如来自 cmets 的Aducci's proposal

【讨论】:

  • @Ukemi 这将是一个新问题。我从来没有使用过这个库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2015-01-15
  • 2020-08-28
相关资源
最近更新 更多