Database 使用parallel.foreach时,DB insert操作比常规foreach慢

Database 使用parallel.foreach时,DB insert操作比常规foreach慢,database,performance,foreach,parallel-processing,Database,Performance,Foreach,Parallel Processing,我有一个函数,它循环遍历我的对象列表,对它们进行一些检查并保存到SQL server数据库 我应该保存的对象数量可以达到数万个,所以我决定使用并行框架来加快保存速度。我使用parallel.foreach来实现这一点 此迭代位于backgroundworker线程中 它可以工作,但我认识到它比“普通”foreach慢。例如,在我的上一次测试中,我的对象列表在2:41.35分钟内处理完毕,常规foreach在2:14.92分钟内处理完毕。差将近半分钟 这是并行框架中DB insert操作的常见行为

我有一个函数,它循环遍历我的对象列表,对它们进行一些检查并保存到SQL server数据库

我应该保存的对象数量可以达到数万个,所以我决定使用并行框架来加快保存速度。我使用parallel.foreach来实现这一点

此迭代位于backgroundworker线程中

它可以工作,但我认识到它比“普通”foreach慢。例如,在我的上一次测试中,我的对象列表在2:41.35分钟内处理完毕,常规foreach在2:14.92分钟内处理完毕。差将近半分钟

这是并行框架中DB insert操作的常见行为吗?是否建议使用parallel.foreach进行DB insert操作

谢谢


VS2010/.Net4/c#

如果您只有一个数据库连接,那么尝试并行保存对象可能只会增加客户端(连接对象)的同步开销。看。在不了解特定代码的情况下,我想更好的方法是尝试仅并行检查,然后按顺序进行保存(使用单个db连接)。当然,如果您的对象是可变的,您需要确保它们不能在检查和保存之间更改,但在当前的方法中仍然如此

顺便问一下,您是在一个事务中将所有这些对象保存到数据库中,还是只打开了自动提交?当然,这取决于什么样的完整性约束适用于您的插入,但是2-3分钟似乎是很长的时间,即使是对于成千上万行。明智地使用事务(如果您目前没有这样做),可能会显著提高性能


编辑以添加:在我的桌面计算机上使用SQLite,我可以使用autocommit在5秒内插入100个1字段行。如果在一个事务中,我可以在13秒内插入10000个单字段行。

Thx。我把代码改成使用事务处理+最后按你说的那样节省。对于同一个测试数据集,现在只需不到2分钟,因此我们赢得了近1分钟的胜利。太好了!:)如果你和10个人一起去一家餐馆,把这10个人分成5组2人真的没有什么帮助。不管怎么说,厨房都快没电了。