問:我想以一次5,000行的方式批量更新一個大型表,但我不知道怎樣分割數(shù)據(jù)。該表不包含增量數(shù)字或整數(shù)主鍵。怎樣才能在保持良好性能的同時實現(xiàn)數(shù)據(jù)更新呢?
答:如果知道哪些行尚未被更新,您可以使用簡單的謂詞來排除已更新的行,rowcount設(shè)置可以幫助您批量分割數(shù)據(jù)。以下的代碼清單說明了如何使用該設(shè)置:
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
在指定的行數(shù)返回后,rowcount將使sql server停止查詢處理。這項技術(shù)很有用,因為它避免了大量更新所致的并發(fā)命中;更新中的行數(shù)越少,更新任務(wù)使其他用戶不能訪問該數(shù)據(jù)的可能性就越小。結(jié)合事務(wù)日志備份,這一方法還可以使您的事務(wù)日志的大小降至最低。
如果沒有識別已更新行的機(jī)制,您可以使用游標(biāo)遍歷所有數(shù)據(jù)并提交每個x值。但是,游標(biāo)占用服務(wù)器資源的時間通常要多于基于集合的語句。
—microsoft sql server開發(fā)團(tuán)隊
新聞熱點(diǎn)
疑難解答
圖片精選