SQL Server中In-Flight日誌究竟有多大

choubou發表於2021-09-09

    在SQL Server中,利用日誌的WAL來保證關聯式資料庫的永續性,但由於硬碟的特性,不可能使得每生成一條日誌,就直接向磁碟寫一次,因此日誌會被快取起來,到一定資料量才會寫入磁碟。這部分已經生成的,卻沒有寫入磁碟的日誌,就是所謂的In-Flight日誌。

    在SQL Server中,In-Flight的日誌的大小取決於兩個因素,根據Paul Randal的說法,In-Flight日誌不能超過60K,因此In-Flight的日誌最大是60K,此外,如果In-Flight日誌沒有到60K,如果發生了Commit或Rollback,那麼直接會寫入磁碟。因此日誌最小為512位元組,最大為60K,以512位元組為單位進行增長。下面我們來看一個例子。

 

    我們首先建立一個簡單的表,迴圈向其中插入10W的資料,該語句會生成大量的日誌,如程式碼清單1所示:

BEGIN TRAN
 DECLARE @i INTEGER
 SET @i = 0 
WHILE ( @i 

   程式碼清單1.生成大量日誌的語句

 

    資料庫我以5M日誌為起點,以5M遞增,上面的語句導致日誌自動增長,如圖1所示。

    圖片描述

圖1.對應的6次日誌增長

 

    我們再來觀察SQL Server程式對於日誌檔案的操作,如圖2所示:

    圖片描述

圖2.SQL Server程式對於日誌檔案的寫

 

   圖2中的圖片我只擷取了一小部分,但是可以看到沒有超過60K的log block,只有在日誌檔案填零增長時,才出現5M的塊。因此我對於微軟亞太資料庫支援組的博文:http://blogs.msdn.com/b/apgcdsd/archive/2013/06/17/sql-server-log-write.aspx中說到會出現超過60K的log write產生一些疑問,畢竟日誌填零增長和logWrite不是一回事。

    因此,得知這一點之後,對於日誌所在的LUN,分配單元64K應該是對於效能來說最優的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4548/viewspace-2800948/,如需轉載,請註明出處,否則將追究法律責任。

相關文章