Sql 插入到其他服务器上的数据库时实体框架性能问题

Sql 插入到其他服务器上的数据库时实体框架性能问题,sql,performance,entity-framework,entity-framework-5,Sql,Performance,Entity Framework,Entity Framework 5,我们已经完成了使用EntityFramework5的应用程序的定稿,该应用程序对特定表执行大约1000次插入/秒 现在,客户端请求应用程序与数据库不在同一服务器上。当我们在这样的场景中部署应用程序时,插入记录所需的时间增加了4倍 我们已经做了性能日志,并将性能损失缩小到执行插入 使用实体框架“在线”处理远程数据库和处理大型数据集(100.000多行)是否存在已知问题?我发现EF在加载大量记录时存在两个性能问题 1) 插入是逐记录执行的(在SQL探查器打开的情况下调用db.SaveChanges(

我们已经完成了使用EntityFramework5的应用程序的定稿,该应用程序对特定表执行大约1000次插入/秒

现在,客户端请求应用程序与数据库不在同一服务器上。当我们在这样的场景中部署应用程序时,插入记录所需的时间增加了4倍

我们已经做了性能日志,并将性能损失缩小到执行插入


使用实体框架“在线”处理远程数据库和处理大型数据集(100.000多行)是否存在已知问题?

我发现EF在加载大量记录时存在两个性能问题

1) 插入是逐记录执行的(在SQL探查器打开的情况下调用db.SaveChanges()时可以看到这一点)

2) 即使在SaveChanges()之前,DbSet.Add()调用也会随着记录的进行而变得越来越慢。关闭更改跟踪会有所帮助,但不会太多

我使用SqlBulkCopy进行大容量插入。SqlBulkCopy为所有记录发出一次插入。对于第二个问题,我使用简单的集合来整理数据,而不是添加到dbset

SqlBulkCopy需要两个额外的任务——需要知道表模式,所以我从EF元数据中提取了这一点。验证有点弱(不存在),因此需要针对缓冲区集合实现它

评论后的附录:

当然,我知道你想知道为什么EF+网络=慢

上面是说我们的经验是EF+100000记录=慢,不管部署拓扑如何。所以,我猜你看到的性能差异与EF无关

这可能是由于在SQL Server上启用了协议(通过SQL Server Configuration Manager)-如果您在服务器上启用了共享内存,您可能会期望与db位于同一服务器上的应用程序比单独服务器上的应用程序运行得更快,因为第二种情况必须通过TCP/IP进行通信

您可以尝试禁用共享内存,看看这对相同的服务器性能有什么影响


我们从来没有出现过这种影响,我很想看到这个问题的最终解决方案

你看了这个,特别是Ladislav Mrnka的答案了吗?

这不是我想要的答案,但我会给你一个分数。