Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体6+;PostgreSQL-糟糕的性能_C#_Postgresql_Entity Framework_Database Performance - Fatal编程技术网

C# 实体6+;PostgreSQL-糟糕的性能

C# 实体6+;PostgreSQL-糟糕的性能,c#,postgresql,entity-framework,database-performance,C#,Postgresql,Entity Framework,Database Performance,我将Entity6与PostgreSQL数据库(与Npgsql连接器)一起使用。除此设置的性能不佳外,其他一切正常。当我尝试向数据库中插入数量不太多的对象(大约20k条记录)时,所花费的时间比应该的要多得多。由于这是我第一次使用实体框架,我很困惑为什么在本地机器上向数据库插入20k条记录要花1分钟以上的时间 为了优化插入,我遵循我找到的每一个技巧。我尝试将AutoDetectChangesEnabled设置为false,每100或1000条记录调用一次SaveChanges(),重新创建数据库上

我将Entity6与PostgreSQL数据库(与Npgsql连接器)一起使用。除此设置的性能不佳外,其他一切正常。当我尝试向数据库中插入数量不太多的对象(大约20k条记录)时,所花费的时间比应该的要多得多。由于这是我第一次使用实体框架,我很困惑为什么在本地机器上向数据库插入20k条记录要花1分钟以上的时间

为了优化插入,我遵循我找到的每一个技巧。我尝试将AutoDetectChangesEnabled设置为false,每100或1000条记录调用一次SaveChanges(),重新创建数据库上下文对象并使用DbContextTransaction对象(通过调用dbContext.database.BeginTransaction()并在操作结束时或每100/1000条记录提交一次事务)。没有任何东西能提高插件的性能,哪怕是一点点

通过登录实体生成的SQL查询,我终于能够发现,无论我做什么,每个对象都是单独插入的,每次插入都需要2-4毫秒。在不重新创建DB上下文对象和不进行事务的情况下,在超过20k次插入之后,只需提交一次。当我使用事务并每隔几条记录提交一次时,就会有更多的提交和新的事务创建(当我重新创建DB上下文对象时也是如此,只是重新建立了连接)。如果我使用事务并每隔几条记录提交一次,我应该会注意到性能提升,不是吗?但最终,无论是否使用多个事务,性能都没有差别。我知道事务不会极大地提高性能,但它们至少应该有一点帮助。相反,在我的本地数据库上执行每个插入仍然至少需要2ms

在本地计算机上创建数据库是一回事,但在远程数据库上创建20k对象需要的时间远远超过一分钟——日志表明,单次插入甚至需要30毫秒(!),每100或1000条记录提交并创建一次事务。另一方面,如果我手动执行一个insert(直接从日志中执行),执行所需时间不到1ms。似乎实体在将每个对象插入数据库时都会花很多时间,即使它使用事务将大量插入打包在一起。我真的不明白


我该怎么做才能真正加快速度呢?

如果有人感兴趣,我找到了解决问题的方法。Entity Framework 6无法在没有额外第三方库的情况下提供快速大容量插入(如我的问题的评论中所述),这些库要么价格昂贵,要么不支持SQL Server以外的其他数据库。另一方面,实体框架核心是另一回事。它支持快速批量插入,并且可以在project中用一系列代码更改来替换EF 6:

有人可能会对此进行进一步阐述,但EF不是为批量插入而设计的。EF无法帮助您开箱即用。有第三方库在EF上实现大容量插入。我的ms如何在客户端和DB服务器之间ping?另外,您正在使用连接池软件吗?发生的情况是,您的软件正在运行多个insert语句,而不是一个包含多条记录的insert语句。不同之处在于,每个SQL语句都要求每条记录有一个完整的“往返行程”(最少2倍的ping时间)。您需要修改基础SQL以使用大容量插入语法。这可以通过插件或手动操作SQL来完成。对E6了解不够,无法提供具体的解决方案。除此之外,降低ping时间将产生巨大的影响(即将计算机放在同一个交换机或机箱上),但目前,ef-core还不能完全取代ef6,这就是为什么我不敢建议它的原因。