分类: 数据库开发技术
2009-04-01 20:47:43
上篇文章我们介绍了tempdb的空间使用类型,这次我们将介绍SQL Server 2005中tempdb的改进。
下面这些是SQL Server 2005 tempdb的几个重要的改进点:
. tempdb日志操作优化避免了将“之后的值”纪录到日志里。当没有这种优化执行
一个更新操作时,更新之前的值和更新之后的值都是被纪录在日志里。举例来说,
如果某人把一个数据条目由“ABC”更新成“XYZ”,ABC就是之前的值,XYZ就是之
后的值,而XYZ是不需要被纪录到日志里的,对于插入操作也是这样。这个优化
对于堆和LOB数据有很大的好处。这种优化能最大限度的减少tempdb的日志大小,
从而提高tempdb日志所在的物理磁盘的I/O传输性能。
. 当文件被创建或者文件大小增长时,即时文件初始化工作不使用零来填充NTFS
文件,这将最大限度的减少了tempdb自动增长时的开销。如果没有这个优化,
tempdb很可能需要很长的时间来完成操作,同时很可能导致应用程序超时。这个
优化需要操作系统是Windows XP 专业版,Windows 2003或者更高的版本,同时
需要为SQLSERVER账号分配特殊的卷权限才能实现。有关即时文件初始化的更多
内容,请参考联机帮助相关章节。
. 当在tempdb中分配页和区时,分配页闩锁协议得到改善,从而减少了更新闩锁数。
另外,分配一个表的前8页的效率得到了改善。因此,当大量用户同时访问tempdb
数据库时,也会减少PFS,SGAM,以及GAM页的资源争夺。
. 被优化后的均衡填充可以减少更新闩锁的资源争夺。均衡填充的意思是:当tempdb
数据库有多个数据文件时,每个数据文件将以均衡的填充比例写入,从而可以保证
操作在所有的数据文件中几乎是同一时间。这种操作在写入期间是通过消除了更新
闩锁来实现的。在SQL Server 2000里,当tempdb同时有很多用户在操作时,这
个更新闩锁将成为很大的资源争夺点。
. tempdb拥有延迟删除的功能。这个延迟删除的意思是:当一个很大的临时表被应
用程序删除时,应用程序不需要太长的等待,有些操作可以异步的通过后台进程来
完成删除操作,因此,它减少了应用程序的响应时间。
. WorkTable缓存得到改善。当一个执行计划被缓存时,Work table通过计划所需要
的多个操作的所有信息并不会被删除,只是截断,Work table 的前9页将会被保留。在SQL Server 2000中,这些信息将全部被删除。SQLServer2000和
SQLServer2005都使用了一个很小的全局的预分配页和区的池来使得work table
的内部创建变得更快。
. SQL Server 2005缓存临时对象。当我们在存储过程,函数,触发器中使用表值函
数,表变量,或者局部的临时表时,频繁的删除和创建是非常耗时的,这将导致
Tempdb数据库上系统目录和分配页的资源争夺。在SQL Server 2005里,这些是
被缓存了的,意思是,删除和创建这些临时对象是非常迅速的。当SQL Server删
除一个临时对象时,它并不移除这个对象的目录条目。如果一个临时对象小于8M,
一个数据页和一个IMA页将会被缓存,因此当重新创建这个临时对象时,这些页就不需要再重新分配。如果一个临时对象大于8M,系统将会使用上面提到的延迟删
除的机制。当tempdb的磁盘空间不足时,SQL Server会清空这些临时对象的缓存。
. SQL Server 2005通过CREATE TABLE 或者SELECT INTO语句来缓存临时表。在某
些情况下,临时表不会被缓存,比如当它被创建后指定了一个明确的DDL操作,或
者指定的约束。如果做为动态语句或者ad-hoc批操作的一部分,临时表也不会被缓存。下面的代码展示了通过动态语句创建一个临时表,这个临时表将不会被缓存。
sp_executeSQL N'create table #t(a int)'
下次,将继续走进tempdb数据库,介绍它所需要的磁盘空间存储。