SQL Server-优化UPDATE语句的执行

时间:2018-10-12 00:32:25

标签: sql sql-server

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

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

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

  1. 一个小时过去了,这对于我们的SQL数据库运行UPDATE查询来说是非常异常的时间。
  2. 我们有一个与该数据库交互的Service Fabric应用程序,在运行该查询大约10分钟后,由于该查询似乎锁定了该数据库,我们开始从Service Fabric群集中抛出运行状况错误。数据库。

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

我有一个自动索引碎片整理器,它每24小时运行一次,因此索引碎片不会造成任何问题。

2 个答案:

答案 0 :(得分:2)

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

SELECT *

答案 1 :(得分:1)

您仍然必须索引表STATUS的列dbo.Capture。它将使您的查询运行速度提高数百倍!

这是操作方法:

CREATE INDEX index_status ON dbo.Capture (STATUS);