SQL Server - 优化UPDATE语句的执行

问题描述 投票:0回答:2

我试图在12列和大约500万条记录的表上运行以下查询:

UPDATE dbo.Capture
SET STATUS = 501,
BATCH = NULL
WHERE STATUS = 1

STATUS = 1的记录数约为400万条记录。在我最终取消它之前,查询运行了一个小时,因为:

  1. 一小时过去了,这是我们的SQL数据库运行UPDATE查询的非常不正常的时间长度。
  2. 我们有一个与此数据库交互的Service Fabric应用程序,在运行此查询大约10分钟后,我们开始从Service Fabric Cluster中获取健康错误,这似乎是因为此查询锁定了数据库。

我的问题是,是否有更有效的方法来更新这400万条记录。我应该尝试批量更新,如果是这样,如何在查询中完成?

我有一个自动索引 - degfragmenter,每24小时运行一次,因此索引碎片不应该导致任何问题。

sql sql-server
2个回答
2
投票

鉴于您正在更新大约80%的行,分解它可能是最简单的方法。这是一种方法(假设Capture具有名为ID的主键列):

WHILE EXISTS (SELECT * FROM Capture WHERE Status=1) BEGIN

UPDATE c1 
SET STATUS = 501, 
BATCH = NULL 
FROM Capture c1 
JOIN (SELECT TOP 10000 ID FROM Capture WHERE STATUS = 1) c2 ON c1.ID = c2.ID

END

1
投票

您仍然必须索引表STATUS的列dbo.Capture。它将以更快的速度运行您的查询!

这是如何:

CREATE INDEX index_status ON dbo.Capture (STATUS);
© www.soinside.com 2019 - 2024. All rights reserved.