栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在实体框架中最快的插入方式

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在实体框架中最快的插入方式

在对您的问题的评论中发表评论:

“ … SavingChanges( 针对每个记录 )…”

那是你最糟糕的事情!调用

SaveChanges()
每个记录都会大大降低批量插入的速度。我将做一些简单的测试,很可能会提高性能:

  • SaveChanges()
    在所有记录后调用一次。
  • 调用
    SaveChanges()
    例如100条记录。
  • SaveChanges()
    例如,调用100条记录并处理上下文并创建一个新的。
  • 禁用变更检测

对于批量插入,我正在尝试以下模式:

using (TransactionScope scope = new TransactionScope()){    MyDbContext context = null;    try    {        context = new MyDbContext();        context.Configuration.AutoDetectChangesEnabled = false;        int count = 0;         foreach (var entityToInsert in someCollectionOfEntitiesToInsert)        { ++count; context = AddToContext(context, entityToInsert, count, 100, true);        }        context.SaveChanges();    }    finally    {        if (context != null) context.Dispose();    }    scope.Complete();}private MyDbContext AddToContext(MyDbContext context,    Entity entity, int count, int commitCount, bool recreateContext){    context.Set<Entity>().Add(entity);    if (count % commitCount == 0)    {        context.SaveChanges();        if (recreateContext)        { context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false;        }    }    return context;}

我有一个测试程序,该程序将560.000实体(9个标量属性,没有导航属性)插入数据库。使用此代码,它可以在不到3分钟的时间内运行。

为了提高性能,重要的是要调用

SaveChanges()
“许多”记录(“许多”大约100或1000)。它还提高了在SaveChanges之后处理上下文并创建新上下文的性能。这样会清除所有
SaveChanges
实体的上下文,但不会这样做,实体仍然以state附加到上下文
Unchanged
。在上下文中,连接实体的大小不断增长,这会逐步降低插入速度。因此,一段时间后清除它会很有帮助。

以下是我的560000个实体的一些度量值:

  • commitCount = 1,recreateContext = false: 很多小时 (这是您当前的过程)
  • commitCount = 100,recreateContext = false: 超过20分钟
  • commitCount = 1000,recreateContext = false: 242秒
  • commitCount = 10000,recreateContext = false: 202秒
  • commitCount = 100000,recreateContext = false: 199秒
  • commitCount = 1000000,recreateContext = false: 内存不足异常
  • commitCount = 1,recreateContext = true: 超过10分钟
  • commitCount = 10,recreateContext = true: 241秒
  • commitCount = 100,recreateContext = true: 164秒
  • commitCount = 1000,recreateContext = true: 191秒

上面的第一个测试中的行为是性能是非常非线性的,并且随着时间的推移会大大降低。(“许多小时”是一个估计,我从未完成此测试,在20分钟后我停止在50.000个实体上。)这种非线性行为在所有其他测试中都不那么重要。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号