有关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。

 

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 CheckPoint的几个误区的更多相关文章

  1. 关于SQL Server镜像的一个小误区

    昨天晚上突然接到客户的电话, 说在配置了镜像的生产环境数据库下修改 “已提交读快照” 选项的时候报错, 需要先取消镜像然后再重新搭建.悲催的是这是个近TB的数据库,问我有没有什么快速的方法.于是我就问 ...

  2. SQL Server学习路径(文章目录)

    SQL Server文章目录 SQL Server文章目录(学习路径)  转自:http://www.cnblogs.com/CareySon/archive/2012/05/08/2489748.h ...

  3. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  4. SQL Server内存理解的误区

    SQL Server内存理解 内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求 ...

  5. SQL Server 服务器磁盘测试之SQLIO篇(一)

    数据库调优工作中,有一部分是需要排查IO问题的,例如IO的速度或者RAID级别无法响应高并发下的快速请求.最常见的就是查看磁盘每次读写的响应速度,通过性能计数器Avg.Disk sec/Read(Wr ...

  6. SQL Server 服务器磁盘测试之SQLIO篇

    原文:SQL Server 服务器磁盘测试之SQLIO篇 数据库调优工作中,有一部分是需要排查IO问题的,例如IO的速度或者RAID级别无法响应高并发下的快速请求.最常见的就是查看磁盘每次读写的响应速 ...

  7. SQL Server误区30日谈 第26天 SQL Server中存在真正的“事务嵌套”

    误区 #26: SQL Server中存在真正的“事务嵌套”错误 嵌套事务可不会像其语法表现的那样看起来允许事务嵌套.我真不知道为什么有人会这样写代码,我唯一能够想到的就是某个哥们对SQL Serve ...

  8. 转 SQL Server中关于的checkpoint使用说明

    在SQL Server中有一个非常重要的命令就是CheckPoint,它主要作用是把缓存中的数据写入mdf文件中. 其实在我们进行insert, update, delete时,数据并没有直接写入数据 ...

  9. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

随机推荐

  1. 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】

    之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...

  2. [Unity3D]自制UnityForAndroid二维码扫描插件

    一周左右终于将二维码生成和扫描功能给实现了,终于能舒缓一口气了,从一开始的疑惑为啥不同的扫码客户端为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想要的有效信息,然后分 ...

  3. oracle函数简析

    (一).数值型函数(Number Functions) 数值型函数输入数字型参数并返回数值型的值.多数该类函数的返回值支持38位小数点,诸如:COS, COSH, EXP, LN, LOG, SIN, ...

  4. Java工程师层级

  5. Jsonp跨域

    Jsonp.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  6. 前端工具 & git笔记

    git diff    (working dir to INDEX ) git diff --cached (INDEX to HEAD) git diff  HEAD  (working dir t ...

  7. Mac AppleScript 自动完成按键

    本人用AppleScript成功实现了打开锐捷app,并且在用户验证框输入我的用户密码,然后强制退出锐捷.(至于为什么这么做呢?用校园网的痛苦,一言难尽啊!) 学习以下内容,首先你要自行百度资料来学习 ...

  8. 大神的Blog挂了,从Bing快照里复制过来的备份

    UWidget封装SWidget到UMG 2015年8月30日0 为了使用UMG中的一些高级或便利特性,需要将制作好的Slate控件封装到UWidget中去. 当前UE4版本4.8.3. 将Slate ...

  9. BZOJ4583 : 购物

    首先,如果一家店的区间完全包含了另一家,那么可以删掉另一家,中间的可以用组合数计算方案数. 那么现在将所有店按$l$排序,那么$l$和$r$都严格递增. 设$f[i][j][k]$表示当前是第$i$天 ...

  10. c#去除List中的重复项

    List<string> list = new List<string> {"a", "a", "b", " ...