我试图在12列和大约500万条记录的表上运行以下查询:
UPDATE dbo.Capture
SET STATUS = 501,
BATCH = NULL
WHERE STATUS = 1
STATUS = 1
的记录数约为400万条记录。在我最终取消它之前,查询运行了一个小时,因为:
我的问题是,是否有更有效的方法来更新这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);