Checkpoint 只會將已提交交易的資料頁寫入磁碟。
Checkpoint 會將自上次 Checkpoint 以來所有在記憶體中被修改的頁面(髒頁)寫回磁碟,不論所屬交易是否已提交。唯一例外是 tempdb,其 Checkpoint 不包含寫回髒頁步驟。
這是預寫記錄(WAL)協定的核心:為了縮短復原時間。資料庫啟動/還原時,從最後一個 Checkpoint 開始重做,若未提交的髒頁已在磁碟,Redo 階段可直接跳過,再由 Undo 階段回滾。若未寫入,Redo 需從記錄重新套用,耗時更長。
CREATE DATABASE CheckpointTest; GO
USE CheckpointTest; GO
CREATE TABLE t1 (c1 INT IDENTITY, c2 CHAR(8000) DEFAULT 'a');
CREATE CLUSTERED INDEX t1c1 ON t1(c1); GO
SET NOCOUNT ON; GO
CHECKPOINT; GO
DBCC TRACEON (3502, 3504, -1); GO
BEGIN TRAN; GO
INSERT INTO t1 DEFAULT VALUES; GO 1280 -- 產生 ~10MB 髒頁
CHECKPOINT; GO
-- 錯誤日誌會顯示:未提交交易的髒頁被寫入磁碟
