有效执行100K更新语句 - C#& Sql Server

时间:2016-07-21 16:32:50

标签: c# sql-server

我的C#应用​​程序从Sql Server检索超过一百万条记录,处理它们然后再更新数据库。这导致接近100,000个更新语句,它们都具有以下形式 -

update Table1 set Col1 = <some number> where Id in (n1, n2, n3....upto n200)

“Id”是具有聚簇索引的int主键。没有两个更新语句更新相同的ID,所以从理论上讲,它们都可以并行运行而不需要任何锁定。因此,理想情况下,我想我应该尽可能多地并行运行。期望所有人都不会超过5分钟。

现在,我的问题是最有效的方法是什么?我正在尝试以下 -

  1. 逐个运行它们 - 这是效率最低的解决方案。需要一个多小时。
  2. 通过在线程上启动每个更新来并行运行它们 - 再次非常低效,因为我们创建了数千个线程但是我还是尝试过它花了一个多小时,其中很多都因为这个或那个连接而失败了问题。
  3. 批量插入新表,然后为更新执行连接。但后来我们遇到了并发问题,因为预计会有多个用户这样做。
  4. 合并批次而非更新 - Google表示合并实际上比单个更新语句慢,所以我没有尝试过。
  5. 我认为这对于处理大量数据的许多应用程序来说必定是一个非常常见的问题。有没有标准的解决方案?任何想法或建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我创建了一个整数tbl类型,以便我可以将所有id作为列表传递给sp,然后单个查询将更新整个表。

这仍然很慢,但我发现这比传统方式更快#34;其中id为(1,2,3)&#34;

TYPE的定义

CREATE TYPE [dbo].[integer_list_tbltype] AS TABLE(
    [n] [int] NOT NULL,
    PRIMARY KEY CLUSTERED 
(
    [n] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO

以下是用法。

declare @intval integer_list_tbltype
declare @colval int=10

update c
set c.Col1=@colval
from @intval i
join Table1 c on c.ID = i.n

如果您有任何问题,请与我们联系。