实体框架的性能问题
Posted
技术标签:
【中文标题】实体框架的性能问题【英文标题】:Performance Woes with Entity Framework 【发布时间】:2016-03-09 13:48:48 【问题描述】:手头的技术:
C# .NET 4.0 SQL Server 2014 实体框架 4.3.1 代码优先 ANTS 性能分析器 7 SQL Server 2014 探查器 2 谷歌搜索问题:
我正在做一些软件的性能工作。有一个特殊的问题会导致严重的减速。对于 EF DataContext
和大约 43 个 ADDED
实体,DataContext.SaveChanges()
方法会占用大量时间。
使用 SQL Profiler 我可以看到插入的持续时间为(大约)0ms
。这符合预期。
使用 ANTS Profiler 我可以看到 DataContext.SaveChanges()
占用(大约)1,500 毫秒。深入研究,这段时间的99.9%
在SNINativeMethodWrapper.SNIReadSyncOverAsync
中度过。
使用谷歌,有用的结果很少(没有,因此这个问题)。很长一段时间以来,我第一次发现自己正在查看 Google 结果的第 2 页及更远的地方(未知水域!)。
有几个关于 SO 的问题引用了这种方法,但来自不同的上下文:
snireadsyncoverasync-performance-issue snireadsyncoverasync-and-waitforsingleobject-blocking-ef-performance我正在寻找不需要以下任何一项的解决方案:
将 EF 升级到 V6+(或任何其他版本) 远离 CodeFirst 不使用 DataContext.SaveChanges() 重新架构软件我应该补充一点,我已禁用以下 EF 设置。这总体上具有积极影响(正如预期的那样),但对问题域没有影响。
Context.Configuration.ValidateOnSaveEnabled = false;
Context.Configuration.AutoDetectChangesEnabled = false;
问题: 任何人都可以建议可以解决或避免此问题的代码更改吗?
【问题讨论】:
阅读此***.com/questions/5940225/…,然后使用SqlBulkCopy
大量插入记录msdn.microsoft.com/en-us/library/…
您应该根据有界上下文模式制作不同的上下文。您应该尝试预编译 dbmodel 并存储它们(它们是大上下文的主要减速),然后在创建 DbContext 的过程中使用每个请求的预编译 dbModel。试试看this online course,因为它解释了你遇到的一切。
@OgnyanDimitrov 这是您的评论。我将观看这些课程(Plural Sight 说我已经看过两个,但我忘记了什么时候!)。我正在寻找不需要大量重新架构的解决方案。这可能无法避免,但这是我的主要目标。我不确定您的建议如何解决或帮助解决我的问题。添加了 43 个实体的有界上下文可能仍会出现相同的问题。如果我编译模型和查询,我怀疑是一样的。
抱歉,我的评论实际上是针对另一个性能问题。
为什么要迁移到 6.1?
【参考方案1】:
按照 cmets 的建议:
实际上,对于 dbcontext 中的这几个条目(怀疑不是环境 DbContext),我认为手头的问题实际上不是对数据库的插入/显示更改,而是实际上是数据库调用本身(例如创建一个连接,身份验证),这是造成这种性能损失的主要问题。我实际上可以想象连接池会大大提高性能。
对于感兴趣的人:对于每个“实际”的 Db 调用(即不是查询准备,而是实际将数据提取/写入数据库),如果给出了连接字符串/数据库名称,EF 将首先建立一个连接,或者使用上下文构造函数的 DbContext(Connection, bool contextOwnsConnection=true) 重载中给出的连接。这将发生在每个实际调用数据库的查询中。对于某些数据库,这种连接的建立可能需要相当多的时间,而循环通过上下文实体并根据状态发出 DELETE/UPDATE/INSERT 调用应该花费(至少对于这几个条目)没有那么多时间.
【讨论】:
以上是关于实体框架的性能问题的主要内容,如果未能解决你的问题,请参考以下文章