有關CheckPoint的概念對大多數SQL Server開發或DBA人員都不陌生。但是包括我自己在內,大家對於CheckPoint都或多或少存在某些誤區,最近和高文佳同學(感謝高同學的探討)關於該處進行過一些探討,整理出來幾個誤區。
1.CheckPoint實例級別,而不是數據庫級別
CheckPoint的時間雖然可以在實例級別進行設置,但CheckPoint的過程是以數據庫為粒度。從CheckPoint在Redo和Undo的作用來看,CheckPoint是為了優化IO和減少Recovery時間,而Recovery是需要日志支持,因此日志是數據庫級別的概念,因此可以知道CheckPoint是以數據庫為單位進行的。
我們來做一個簡單的實驗,分別設置兩個連接A和B,A和B使用不同的數據庫並修改數據產生髒數據,在A上進行了CheckPoint後,A連接的數據庫髒頁全部寫入磁盤,而B連接產生的髒頁依然駐留在Buffer中,因此可以確定CheckPoint是數據庫級別而不是服務器級別。
圖1.CheckPoint是數據庫級別的
2.由於日志增長導致的自動CheckPoint會將所有數據庫的髒頁寫入磁盤
事實證明,這也是錯誤的,自動CheckPoint僅僅會將某些髒頁或日志過多的數據庫髒頁寫入磁盤。可以同樣通過圖1的例子進行。
3.CheckPoint僅僅將已經提交的髒數據寫入磁盤
這同樣是錯誤的,無論事務是否提交,所產生的髒數據都會被CheckPoint寫入磁盤。例證可以參看我的博文:再談SQL Server中日志的的作用中有關CheckPoint的實驗。
4.如果一個實例上有多個數據庫,則CheckPoint是並行的
錯誤,通過3502跟蹤標記來看,CheckPoint是串行的,也就是一個數據庫CheckPoint完了才會繼續下一個。如圖2所示。
查看本欄目
圖2.串行CheckPoint
我們可以注意到,CheckPoint使用的是同一個Spid。