SQL Server - 优化UPDATE语句的执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 Cluster中获取健康错误,这似乎是因为此查询锁定了数据库。

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

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

答案

鉴于您正在更新大约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
另一答案

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

这是如何:

CREATE INDEX index_status ON dbo.Capture (STATUS);

以上是关于SQL Server - 优化UPDATE语句的执行的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 update语句只能更新1行数据?

SQL Update语句不起作用 - SQL Server

SQL Server UPDATE语句的用法详解

SQL Server 锁定的 UPDATE 优化

一文带你搞懂如何优化慢SQL

如何获取 SQL Server 中 INSERT、UPDATE、DELETE、SELECT 语句的速率?