繁体   English   中英

有效执行100K更新语句-C#和SQL Server

[英]Efficiently execute 100K update statements - 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表示,合并实际上比单个更新语句要慢,因此我没有尝试过。

我想对于许多处理大量数据的应用程序,这肯定是一个非常普遍的问题。 有没有标准的解决方案? 任何想法或建议,将不胜感激。

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

这仍然很慢,但是我认为这比常规的“ where id in(1,2,3)”要快得多

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

如果您有任何疑问,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM