在生產環境中,若需更新大量資料,一次性 UPDATE 易造成長時間鎖表、日誌暴增、阻塞業務。SQL Server 提供 TOP (n) 子句配合 UPDATE,可將大操作拆解為小批次,降低鎖爭用。本文說明隨機更新與有序更新兩種模式。
UPDATE TOP (n)語法:UPDATE TOP (n) table SET col = val WHERE condition;
特點:引擎從符合條件的資料列中「隨機」挑選 n 筆進行更新,不保證順序。適用於「只要更新任意 N 筆即可」的業務,例如將部分客戶重新分配給另一業務員。
USE AdventureWorks2008R2;
GO
UPDATE TOP (10) Sales.Store
SET SalesPersonID = 276
WHERE SalesPersonID = 275;
GO
TOP + 子查詢 + ORDER BY若業務要求「按特定順序更新前 N 筆」(如依入職日期調整最資深 10 人假期),需先用子查詢排序取得主鍵,再以主鍵關聯更新。
UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (
SELECT TOP 10 BusinessEntityID
FROM HumanResources.Employee
ORDER BY HireDate ASC
) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;
GO
WHILE @@ROWCOUNT > 0 迴圈,每批 500~5000 筆,批次間 WAITFOR DELAY 釋放鎖。WHERE 條件欄位與 ORDER BY 欄位有支援索引,避免子查詢全掃。BULK_LOGGED 恢復模式或分批備份日誌。TOP 子句讓 UPDATE 具備「分頁式」處理能力,配合有序子查詢可精準控制更新順序。善用此技巧,能在不修改表結構、不停機的前提下,安全完成大規模資料修正。