Sql-Server-2008
如何在大插入期間最小化日誌記錄?
在每晚計劃的任務中,我正在使用
select into
然後添加聚集索引從頭開始創建一個大表。我想在整個過程中盡量減少日誌量,因為我的日誌備份傳送頻寬有限。如果有幫助,我很樂意考慮另一種方法。
根據我的經驗,最好的方法是:
- 創建空表
- 創建聚集索引(匹配您的源表)
INSERT
使用TABLOCK
提示進行最少的日誌記錄詳細資訊包含在本 MS 白皮書中。
首先創建表,然後在與源相同的鍵上對其進行索引,從而消除了排序。
如果鍵匹配、
TABLOCK
被使用並且啟用了跟踪標誌 610,則操作將被最低限度地記錄(記錄頁面而不是事務或行)。對我來說,這更快,因為在強制排序之後添加聚集索引
SELECT INTO
可能非常昂貴且耗時。編輯:
TF 610 僅用於控制插入索引表時的最小日誌記錄行為。
我不知道使用它有任何問題,但 MS 建議(我認為是防禦性的)在使用前進行測試。
有沒有一種簡單的方法來衡量一個事務產生了多少日誌記錄,以便我可以定量地比較方法?
簡單的方法,您可以在批處理之前和之後從 dm_io_virtual_file_stats DMV 記錄目前日誌使用情況。但是,這會被其他伺服器活動污染,因此只有在您可以單獨測試時才有用。
SELECT DB_NAME(DB_ID()) AS [Database Name] , vs.[file_id] , vs.num_of_reads , vs.num_of_bytes_read , vs.num_of_writes , vs.num_of_bytes_written FROM sys.database_files f INNER JOIN sys.dm_io_virtual_file_stats(DB_ID(), NULL) vs ON vs.file_id = f.file_id WHERE f.type_desc = 'LOG' OPTION (RECOMPILE) ;
更好的任務工具是sp_whoisactive,如果設置了參數,它會報告每個事務日誌的統計資訊
@get_transaction_info
。