Sql-Server
如何避免大型 DML 操作期間的超時
我有一個需要執行的大插入腳本。它大約有 55,000 條記錄和 160 列。該腳本已創建,我無法再次創建它。
我遇到的問題是它執行了大約 4 個小時左右,在此期間,使用該數據庫的系統變得非常慢並且超時很多。
我不在乎我的 INSERT 是否較慢,但它不應該影響其他使用者。
我正在考慮做一些批次,比如說 500 行並使用
WAITFOR
,但想知道是否有更好的選擇來做這件事。
將操作分解為多個單獨的事務塊。
BEGIN TRANSACTION; INSERT ... INSERT ... -- maybe 1000 or 2500 of these COMMIT TRANSACTION; GO WAITFOR DELAY '00:00:01'; GO BEGIN TRANSACTION; INSERT ... INSERT ... -- maybe 1000 or 2500 more of these COMMIT TRANSACTION;
這將防止所有 55,000 個插入阻塞您的日誌並作為單個阻塞事務執行。我在這篇博文中在某種程度上談到了這種方法論,儘管它談到了更嚴格控制的
DELETE
操作。如果可以的話,讓文件以一種更容易
BULK INSERT
或 bcp 的格式重新生成。