首页 > 解决方案 > SQL Server - 优化 UPDATE 语句的执行

问题描述

我正在尝试对 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 集群的运行状况错误,这似乎是由于该查询锁定了数据库。

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

我有一个自动索引分解器,它每 24 小时运行一次,因此索引的碎片应该不会导致任何问题。

标签: sqlsql-server

解决方案


鉴于您要更新大约 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

推荐阅读