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