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万条记录。在我最终取消它之前,查询运行了一个小时,因为:
- 一小时过去了,这是我们的SQL数据库运行UPDATE查询的非常不正常的时间长度。
- 我们有一个与此数据库交互的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语句的执行的主要内容,如果未能解决你的问题,请参考以下文章