【问题标题】:Parallel ForEach with SQL inserts c#带有 SQL 的并行 ForEach 插入 c#
【发布时间】: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.ForEachforeach 来加快进程...有什么想法吗?

顺便说一句...我们正在调用一个包含普通INSERT INTO命令的存储过程,使用分类ADO.NET

【问题讨论】:

  • SQL 的并行执行需要自己的连接和事务。如果您需要在一个事务中包含所有内容,您也可以查看TransactionScope
  • 不要使用@@IDENTITY。 99% 的时间都是你想要的 SCOPE_IDENTITY docs.microsoft.com/en-us/sql/t-sql/functions/…
  • 如果你的瓶颈在数据库端,并行 foreach 可能对你没有帮助。相反,它甚至可能会产生更多开销并减慢您的速度。
  • @paparazzo,这是关于想法,而不是代码......我指出了简单的代码场景,我只是在考虑我应该通过的想法和方法
  • 使用SCOPE_IDENTITY(),如果这不能解决您的问题,您将需要重写您的存储过程,因为它必须插入到多个表中。但正如其他人所说,你真的应该发布一些代码。这个想法是合理的,实现可能有缺陷,但我们无法知道这一点,所以我们只能猜测。

标签: c# foreach ado.net parallel.foreach


【解决方案1】:

您可以使用 guid 作为表的主键。这将帮助您避免@@IDENTITY 的问题。 首先你应该生成新的 guid-identity,谢谢将生成的值插入一行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多