Sql-Server-2008

如何在大插入期間最小化日誌記錄?

  • May 15, 2020

在每晚計劃的任務中,我正在使用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

引用自:https://dba.stackexchange.com/questions/8614