在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 < 100000 ) BEGIN INSERT INTO Number VALUES ( @i ) SET @i = @i + 1 END CHECKPOINT COMMIT
代碼清單1.生成大量日志的語句
數據庫我以5M日志為起點,以5M遞增,上面的語句導致日志自動增長,如圖1所示。
圖1.對應的6次日志增長