使用parallel.foreach时,DB插入操作比常规foreach更慢

时间:2011-08-03 17:34:31

标签: database performance foreach parallel-processing

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

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

此迭代在后台工作线程中。

它有效,但我认识到它比'普通'foreach慢。例如。在我的上一次测试中,我的对象列表在2:41.35分钟内处理,常规的foreach在2:14.92中执行。差异将近半分钟。

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

THX!

VS2010 / .NET4 / C#

1 个答案:

答案 0 :(得分:2)

如果您有单个数据库连接,尝试并行保存对象可能只是在客户端(连接对象)上添加同步开销。请参阅potential pitfalls of parallelism。在不了解您的特定代码的情况下,我猜想更好的方法是尝试并行化检查,然后执行保存(使用单个数据库连接) )顺序。当然,如果你的对象是可变的,你需要确保它们在检查和保存之间不能改变,但在当前的方法中仍然如此。

顺便说一下,您是在一次交易中将所有这些对象保存到数据库中,还是只进行自动提交?当然,这取决于你的插入适用于什么样的完整性约束,但是对于数万行来说,2-3分钟似乎很长一段时间。明智地使用交易,如果您目前不是,可能会使您的业绩显着提高。

编辑添加:在桌面计算机上使用SQLite,我可以使用自动提交在5秒内插入100个1字段行。如果它们在单个事务中,我可以在13秒内插入10,000个1字段行。