問:我想以一次5,000行的方式批量更新一個大型表,但我不知道怎樣分割數據。該表不包含增量數字或整數主鍵。怎樣才能在保持良好性能的同時實現數據更新呢?
答:如果知道哪些行尚未被更新,您可以使用簡單的謂詞來排除已更新的行,ROWCOUNT設置可以幫助您批量分割數據。以下的代碼清單說明了如何使用該設置:
SET ROWCOUNT 1000
WHILE (1=1) BEGIN
BEGIN TRANSACTION
UPDATE...set ...,MyLastUpdate='date',...WHERE
MyLastUpdate < 'date'
-- 更新1000未更新行
IF @@ROWCOUNT = 0
BEGIN
COMMIT TRANSACTION
BREAK
END
COMMIT TRANSACTION
END
在指定的行數返回後,ROWCOUNT將使SQL Server停止查詢處理。這項技術很有用,因為它避免了大量更新所致的並發命中;更新中的行數越少,更新任務使其他用戶不能訪問該數據的可能性就越小。結合事務日志備份,這一方法還可以使您的事務日志的大小降至最低。
如果沒有識別已更新行的機制,您可以使用游標遍歷所有數據並提交每個x值。但是,游標占用服務器資源的時間通常要多於基於集合的語句。
—Microsoft SQL Server開發團隊