使用Entity Framework时遇到性能问题

4
手头的技术包括:
  • C# .NET 4.0
  • SQL Server 2014
  • Entity Framework 4.3.1
  • Code First
  • ANTS Performance Profiler 7
  • SQL Server 2014 Profiler 2
  • Google 搜索
问题描述:
我正在对一些软件进行性能优化,有一个特定问题导致了严重的减速。使用约43个ADDED实体的EF DataContext时,DataContext.SaveChanges()方法需要花费大量时间。使用SQL Profiler,我可以看到插入操作的持续时间大约为0ms,这是预期的。使用ANTS Profiler,我可以看到DataContext.SaveChanges()需要大约1500ms。深入研究后,其中99.9%的时间都花费在SNINativeMethodWrapper.SNIReadSyncOverAsync内部。使用谷歌搜索,几乎没有有用的结果(因此提出这个问题)。长时间以来,我第一次发现自己要查看谷歌搜索结果页面2及以下(未知领域!)。在SO上有几个问题涉及此方法,但来自不同的上下文: 我正在寻找不需要以下任何一项的解决方案:
  • 升级EF到V6+(或任何其他版本)
  • 远离CodeFirst
  • 不使用DataContext.SaveChanges()
  • 重新设计软件
我应该补充说明,我已经禁用了以下EF设置。总体上,这具有积极的效果(如预期),但对问题领域没有影响。
  • Context.Configuration.ValidateOnSaveEnabled = false;
  • Context.Configuration.AutoDetectChangesEnabled = false;
问题是:
有人能提供代码更改的建议来解决或避免此问题吗?

@OgnyanDimitrov 感谢您的评论。我会看一下这些课程(Plural Sight说我已经看了两个,但我忘记了是什么时候!)。我正在寻找一种不需要重大重构的解决方案。虽然这可能是不可避免的,但这是我的主要目标。我不确定您的建议如何解决或帮助解决我的问题。一个包含43个添加实体的有界上下文仍然可能出现相同的问题。如果我编译模型和查询,我怀疑也会出现相同的问题。 - Paul Fleming
抱歉,但我的评论实际上是针对另一个性能问题的。 - Ognyan Dimitrov
你为什么犹豫不决地不升级到6.1呢? - Ognyan Dimitrov
@OgnyanDimitrov。升级到6.1版本并不能保证问题得到解决,而且需要付出大量的工作。 - Paul Fleming
@DevilSuichiro,你可能有点头绪了。我之前对数据库进行了分析,大多数的INSERT操作都返回为0。现在我又重新进行了分析,这次它们的返回时间在15到60毫秒之间。平均值约为33毫秒,它们总共需要约1,400毫秒的时间。所以看来这就是我的问题所在。数据库太大了,再加上人为错误!把你的评论写成答案,这个问题就归你了... - Paul Fleming
显示剩余4条评论
1个回答

1

根据评论提出的建议:

实际上,对于dbcontext中的这几个条目(怀疑不是环境DbContext),我认为手头的问题并不是将更改插入/显现到数据库中,而是数据库调用本身(如创建连接、身份验证)才是导致性能损失的主要问题。我可以想象连接池会大大提高性能。

对于那些感兴趣的人:对于每个“实际”的Db调用(即不是查询准备,而是实际从数据库中获取/写入数据),EF将首先建立一个连接,如果给定了连接字符串/数据库名称,或者使用在上下文构造函数的DbContext(Connection, bool contextOwnsConnection=true)重载中给定的连接。这将发生在每个实际调用数据库的查询中。对于某些数据库,这种连接的建立可能需要很长时间,而循环遍历上下文实体并根据状态发出DELETE/UPDATE/INSERT调用应该不需要太多时间(至少对于这几个条目来说是这样)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接