1. 程式人生 > >SQL Server CheckPoint的幾個誤區

SQL Server CheckPoint的幾個誤區

    有關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

圖1.CheckPoint是資料庫級別的

2.由於日誌增長導致的自動CheckPoint會將所有資料庫的髒頁寫入磁碟

    事實證明,這也是錯誤的,自動CheckPoint僅僅會將某些髒頁或日誌過多的資料庫髒頁寫入磁碟。可以同樣通過圖1的例子進行。

3.CheckPoint僅僅將已經提交的髒資料寫入磁碟

    這同樣是錯誤的,無論事務是否提交,所產生的髒資料都會被CheckPoint寫入磁碟。例證可以參看我的博文:再談SQL Server中日誌的的作用中有關CheckPoint的實驗。

4.如果一個例項上有多個數據庫,則CheckPoint是並行的

    錯誤,通過3502跟蹤標記來看,CheckPoint是序列的,也就是一個數據庫CheckPoint完了才會繼續下一個。如圖2所示。

    2

    圖2.序列CheckPoint

    我們可以注意到,CheckPoint使用的是同一個Spid。

5.將恢復間隔設定為1分鐘,意味著每1分鐘會對所有的資料庫做一次CheckPoint

    錯誤。將恢復間隔設定為1分鐘不能想成建立一個Agent,每分鐘寫一個CheckPoint命令,這是兩碼事。這只是意味著每分鐘去檢查一次是否需要做CheckPoint,如果期間積累的日誌量足夠,才會對積累足夠日誌量的資料庫去做CheckPoint。即使中間積累了巨量的日誌,不到1分鐘也不會做CheckPoint。

6.SQL Server一些Internal CheckPoint時,比如說關閉資料庫,會對所有資料庫做CheckPoint(高同學補充)

    這條是正確的微笑,因為SQL Server此時需要保證所有的資料寫入磁碟,從而保證了資料庫一致性,如果沒有活動的事務,那麼這種關閉方式叫做Clean ShutDown,這意味著該資料本身一致,因此即使沒有日誌,MDF也可以附加。

7.CheckPoint是一個時間點(高同學補充)

    錯誤,這是打遊戲存檔的想法,從哪存進度,從哪取進度,是某個時間點。在SQL Server中,CheckPoint是一個完整的過程,這個過程的耗時取決於髒資料的大小,更多資料,請參閱MSDN:http://technet.microsoft.com/zh-cn/library/ms188748.aspx

8.引發自動CheckPoint的條件是記憶體中髒頁的多少(高同學補充)

    錯誤,CheckPoint的觸發條件,是在CheckPoint期間生成日誌的大小。因此,大家見過記憶體中有很多髒頁,卻不引發CheckPoint的情況。

9.當資料所在磁碟壓力大時,通過checkpoint pages/ sec 計數器來觀察寫入磁碟的髒頁(高同學補充)

    部分正確。實際上,髒頁被寫入磁碟一共有3中方式,CheckPoint僅僅是其中一種,我們還需要將Lazy writes/sec考慮在內。

10.TempDB上永遠不會寫入髒頁

    錯誤。TempdB是一個特殊的資料庫,永遠只能簡單恢復模式,如果您在TempDB上造成大量髒頁,自動CheckPoint時會發現的確不會有任何髒頁寫入操作,但手動CheckPoint時,髒頁依然會被寫入磁碟。

   最後,再次感謝高文佳同學和我探討。

相關推薦

SQL Server 常用 設定(set)選項

   1. SET DEADLOCK_PRIORITY   2. SET LOCK_TIMEOUT   4.SET IDENTITY_INSERT   5.SET IMPLICIT_TRANSACTIONS   6.SET NOCOUNT   8.SET ROWCOUN

SQL Server CheckPoint誤區

    有關CheckPoint的概念對大多數SQL Server開發或DBA人員都不陌生。但是包括我自己在內,大家對於CheckPoint都或多或少存在某些誤區,最近和高文佳同學(感謝高同學的探討)關於該處進行過一些探討,整理出來幾個誤區。 1.CheckPoint例項級別,而不是資料庫級別    

sql server 計算兩時間 相差的 天幾時

var cas edi ediff date art star start har CAST ( CAST ( DATEDIFF ( ss, StartTime, ConcludeTime ) / ( 60 * 60 * 24 ) AS INT ) AS VARCHAR

SQL SERVER 擷取多分隔符中指定第分隔符的前邊的內容

       又是一個難懂的標題,上例子吧,比如一個字串,‘abc,1344,343,13as,33,343’,這個字串都是用','分隔的,現在想擷取第四個逗號前邊所有的內容,方法如下: CREATE FUNCTION [dbo].[Get_StrArra

英語學習的誤區

道理 log 錯誤 單詞 成功 難度 不知道 post 沒有 在簡書上看到一篇文章講述了英語學習過程中可能會碰到的幾個誤區,看完感覺很有道理。誤區一:磨耳朵   每天大量泛聽英語音頻,甚至將其當作生活的背景音樂,營造一種“浸入式”的英語環境。   但是不走心的聽力是沒有用的

SQL Server 獲取兩日期間的日期

() serve server cts where sele sel lar obj declare @start datetime declare @end datetime set @start = ‘2018-01-25‘ set @end = ‘201

SQL Server種遍歷方式比較

不同 .com font size 常用 分享 分享圖片 遊標 inf SQL遍歷解析   在SQL的存儲過程,函數中,經常需要使用遍歷(遍歷table),其中遊標、臨時表等遍歷方法很常用。面對小數據量,這幾種遍歷方法均可行,但是面臨大數據量時,就需要擇優選擇,不同的遍歷方

SQL Server @@ERROR的小誤區大Bug

nbsp err comm pan value 寫法 col -s 產生 在公司項目中看到有這樣使用事務的: -- 開啟事務 BEGIN TRAN INSERT TABLE1(ID) VALUES (1) INSERT TABLE2(ID) VALUES

php用於防SQL注入的函式

用於防SQL注入的幾個函式 不要相信使用者的在登陸中輸入的內容,需要對使用者的輸入進行處理 SQL注入: ' or 1=1 #   防止SQL注入的幾個函式:   addslashes($string):用反斜線引用字串中的特殊字元' " \ $u

10年IT工作經驗告訴你:新人常見的誤區

我工作10+年了,大概五年前從技術轉管理後,多少還是發現一些職場新人職業發展的問題。 表現驚豔的新人肯定有,這種人往往在學校裡面或者進入職場後就養成了一些非常良好的做事方式和工作習慣,工作效率高,產出多,甚至很短時間內就可以帶新人,年度最佳新人當之無愧。 然而表現不到位的似乎更多一些,這些員

關於敏捷團隊領任務的誤區

本文轉自:Leangoo 原文連結:https://www.leangoo.com/13956.html 敏捷開發團隊(Scrum團隊)在每天開每日站會的時候會領取當天的任務,這個實踐在敏捷開發中叫做sign-up-for-tasks即領任務。這個實踐源自極限程式設計,在1998年,極限程式

資料的差集;利用sql server取兩資料集的交、差、補集

差集: 需求:選出在t1表中但不在t2表中的資料 補集: A是B的子集,求A相對於B的補集。 SQLServer中通過intersect,union,except和三個關鍵字對應交、並、差三種集合運算。 他們的對應關係可以參考下面圖示 測試示例: 構造A,B

自動化測試的型別以及對測試自動化的誤區

分享一些資深軟體測試技術大咖錄製的視訊錄影:效能,功能,介面,安全,自動化,linux和工具抓包,JAVA自動化框架等,歡迎大家加群學習交流。 軟體測試學習交流群:747981058

軟體測試認識的誤區

隨著市場對軟體質量的不斷提高,軟體測試不斷受到重視,但是由於總體上,國內軟體專案過程不規範,導致重視編碼和輕視測試的現象,對於軟體測試的重要性、測試方法和流程等還存在很多錯誤的認識。根據作者的軟體工作經驗,本文列舉了七種有代表性的軟體測試得認識誤區,並作了剖析和相應的解釋。希

SQL Server 比較兩資料庫的表結構差異

IF EXISTS ( SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[p_comparestructure]')

深拷貝的誤區

  週末賦閒在家,因為太冷了,不想出門,索性宅一天好了。但是閒著沒事做總是很無聊的,正好新的一年想抓一下童鞋同學的程式碼質量,就隨便打開了幾個童鞋寫的程式碼。於是故事就展開了。   團隊大了之後,如何統一團隊程式碼風格其實是一個蠻重要的問題,目前我們團隊使用lint的方式進行了限制,這次的review可以說

sql語句的常用函式總結

結構化查詢語言(Structured Query Language,簡稱SQL語句)從單個函式的使用上來看,較為簡單,但是當表與表巢狀、幾個函式組合使用,即可實現強大的資料查詢功能,能從資料庫中快速便捷地獲取需要的資訊。 本文總結了sql語句中常用的5個函式,

sql Server 保留位小數

如果在資料庫用的float型別存資料 在程式裡面Decimal接受,會是填的什麼資料儲存什麼資料 但是如果在資料庫裡面用numeric(18,2)存資料,在程式裡面用ToDecimal 接受,會新增小數,可以在顯示的時候取小數 如果Decimal沒有給小數,對於資料庫使

sql儲存過程簡單例子(一)

導讀:sql儲存是資料庫操作過程中比較重要的一個環節,對於一些初學者來說也是比較抽象難理解的,本文我將通過幾個例項來解析資料庫中的sql儲存過程,這樣就將抽象的事物形象化,比較容易理解。 例1: create proc proc_stu @sname varchar(20

防止sql注入的簡單函式應用

幾個簡單的函式有:  trim ( string $str [, string $charlist = " \t\n\r\0\x0B" ] ) 去除字串首尾處的空白字元(或者其他字元) 此函式返回字