我们已经完成了使用Entity Framework 5的应用程序,并且对特定表执行大约1000次插入/秒。
现在,客户端已请求该应用程序与数据库不在同一服务器上。当我们在这种情况下部署应用程序时,插入记录所需的时间增加了4倍。
我们已经完成了性能日志,并缩小了执行插入的性能损失。
在线上使用Entity Framework来处理远程数据库和处理大量数据(100.000+行)是否存在已知问题?
答案 0 :(得分:1)
我在加载大量记录时发现了EF的两个性能问题。
1)逐条记录执行插入(在调用SQL profiler时调用db.SaveChanges()时可以看到这一点。
2)即使在SaveChanges()之前,DbSet.Add()调用也会随着记录的进展而变得越来越慢。关闭变更跟踪有帮助,但不多。
我使用SqlBulkCopy进行大量插入。 SqlBulkCopy为所有记录发出单个插入。对于第二个问题,我使用简单集合来整理数据,而不是添加到DbSets。
SqlBulkCopy还需要一些额外的任务 - 需要知道表模式,因此我将其从EF元数据中拉出来。验证有点弱(不存在),因此您需要针对缓冲区集合实现它。
评论后的附录:
当然,我知道你想知道为什么EF + Network =慢。
以上是我们的经验是EF + 100,000记录=慢,无论部署拓扑如何。所以,我的猜测是你所看到的性能差异与EF无关
这可能是由于SQL Server上启用了协议(通过Sql Server配置管理器) - 如果您在服务器上启用了共享内存,您可能会认为应用程序位于同一服务器上数据库运行速度快于单独服务器上的数据库,因为第二种情况必须通过TCP / IP进行通信。
您可以尝试禁用共享内存并查看它对同一服务器性能的影响。
我们似乎从来没有这种影响,我很想看到这个问题的最终解决方案。
答案 1 :(得分:1)
你有没有看过question和Ladislav Mrnka的答案?