有時候遇到一些原因,我們必須在營運中的資料庫上 update 多筆資料,但是營運中的情況下又會擔心是否鎖住該張 TABLE 太久,此時我們可以透過迴圈,試著分成多次來 update ,至少不會一次就 update 太久,避免該 TABLE 鎖住太久。
.建立測試資料
CREATE TABLE
CREATE TABLE TEST(u_id int, u_name varchar(20))
Insert 5000 筆資料
DECLARE @count int
DECLARE @i int
SET @count = 5000
SET @i = 1
WHILE @i <= @count
BEGIN
INSERT INTO TEST
VALUES(1,'test')
SET @i=@i+1
END
.開始分批進行 update
假設我們想要 update 這5000 筆的 u_id 都變成 2,但希望分批update,一次只update 500 筆就好,且每完成500筆就等2秒。
DECLARE @count int
SET @count = 500
WHILE 1=1
BEGIN
UPDATE top (@count) TEST
SET u_id =2
WHERE u_id =1
IF @@ROWCOUNT < @count
BEGIN
BREAK;
END
WAITFOR DELAY '00:00:02';
END
.小結
透過這樣的方式可以降低該張 TABLE 被鎖住的時間,另外透過等待的那2秒,讓SQL Server可以完成因update 鎖住的其他工作。