Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1266051
  • 博文数量: 510
  • 博客积分: 20296
  • 博客等级: 上将
  • 技术积分: 4680
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-30 03:58
文章存档

2011年(13)

2010年(92)

2009年(242)

2008年(163)

我的朋友

分类: 数据库开发技术

2009-04-01 20:47:43

上篇文章我们介绍了tempdb的空间使用类型,这次我们将介绍SQL Server 2005tempdb的改进。

 

下面这些是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

        数据库时,也会减少PFSSGAM,以及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数据库,介绍它所需要的磁盘空间存储。

阅读(624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~