CHECKSUM 和 Tempdb

Ø 参考文档

https://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/

https://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/23/checksum-and-tempdb.aspx

 

可能您有印象从SQL Server2005开始有一个选项开启在用户数据库上的CHECKSUM功能。更多细节参见https://blogs.msdn.com/sqlserverstorageengine/archive/2006/06/29/Enabling-CHECKSUM-in-SQL2005.aspx.

事实上,在SQL Server2005中每个新建的数据库都是默认开启CHECKSUM功能,但从其他版本升级到SQL Server2005的数据库不会自动开启,需要开启时使用ALTER DATABASE命令。启用CHECKSUM是十分重要的,在查询的一部分需要读数据页或者运行DBCC CHECKDB命令式,它能使数据库检测到IO路径上的损坏状况(如磁盘故障)。美中不足的是,SQL Server不允许对tempdb启用CHECKSUM。即使我们在用户数据库上启用了CHECKSUM,由于磁盘问题导致的页损坏还是会通过tempdb的这个漏洞进入该用户数据库。以下描述了这样一个示例场景

Ø 示例场景:

批量导入数据到一个临时表格然后再导入用户数据库。用户数据库启用了CHECKSUM,所以新页面写入磁盘的时候会计算CHECKSUM。但有没有不计算CHECKSUM的情况呢?如果因磁盘损坏而损坏的页面先进入tempdb再进入用户数据库时,SQL Server无法知道页面是否损坏,也不会检测这些进入用户数据库的页面。是的,当页面随后被读取时,SQL Server有可能检测出错误也有可能检测不出,取决于是如何损坏的。例如,如果一个整数值发生了位翻转时,它就会被发现。

 

在SQL Server2008中,temp数据库中允许开启 CHECKSUM则弥补了上述不足。你可以用这样的命令开启

ALTER DATASE tempdb set PAGE_VERIFY CHECKSUM

对于新安装的SQL Server2008,所有的tempdb都默认开启CHECNSUM功能,用户可以使用ALTER DATABASE功能关闭这一功能,但是我们不建议这样做。对于从其它版本升级到SQL Server2008中的数据库,用户可以明确开启在tempdb中的CHECKSUM功能,对性能的影响也非常小(对CPU使用率的影响小于2%),基本和在其他用户数据库中消耗一样。不同之处在于,因为CHECKSUM功能只在页写入磁盘的时候运行而tempdb没有checkpoint,所以tempdb只在内存压力大时写入磁盘。所以你可能不会看到tempdb中有很多次计算CHECKSUM。