【发布时间】:2018-06-22 21:10:30
【问题描述】:
我有一个像下面这样的对象,但是数据量很大,我们观察到插入 SQL 数据库需要很长时间,因为我们使用普通的foreach,主要思想是插入每个部门和获取生成的标识号,然后插入分配有该部门 ID 的嵌套员工。
<Sample>
<Departments>
<Department>
<Name>HR</Name>
<Employees>
<Employee>
<Name>Marco</Name>
</Employee>
<Employee>
<Name>John</Name>
</Employee>
<Employee>
<Name>Sarah</Name>
</Employee>
</Employees>
</Department>
<Department>
<Name>IT</Name>
<Employees>
<Employee>
<Name>Ali</Name>
</Employee>
<Employee>
<Name>Roberto</Name>
</Employee>
<Employee>
<Name>Franco</Name>
</Employee>
</Employees>
</Department>
</Departments>
</Sample>
我们尝试使用Parallel.ForEach 来提高性能,并且确实如此,但我们遇到了@@IDENTITY 的另一个问题,因为在 Parallel.ForEach 中运行的任务之间存在重叠,因为我们发现一名员工被分配给另一个员工部门。
需要 ...我需要使用Parallel.ForEach 或foreach 来加快进程...有什么想法吗?
顺便说一句...我们正在调用一个包含普通INSERT INTO命令的存储过程,使用分类ADO.NET
【问题讨论】:
-
SQL 的并行执行需要自己的连接和事务。如果您需要在一个事务中包含所有内容,您也可以查看
TransactionScope。 -
不要使用
@@IDENTITY。 99% 的时间都是你想要的SCOPE_IDENTITYdocs.microsoft.com/en-us/sql/t-sql/functions/… -
如果你的瓶颈在数据库端,并行 foreach 可能对你没有帮助。相反,它甚至可能会产生更多开销并减慢您的速度。
-
@paparazzo,这是关于想法,而不是代码......我指出了简单的代码场景,我只是在考虑我应该通过的想法和方法
-
使用
SCOPE_IDENTITY(),如果这不能解决您的问题,您将需要重写您的存储过程,因为它必须插入到多个表中。但正如其他人所说,你真的应该发布一些代码。这个想法是合理的,实现可能有缺陷,但我们无法知道这一点,所以我们只能猜测。
标签: c# foreach ado.net parallel.foreach