日期:2014-05-16  浏览次数:20473 次

SQL Server 2008性能故障排查(四)——TempDB

接着上一章:I/O

TempDB:

         TempDB是一个全局数据库,存储内部和用户对象还有零食表、对象、在SQLServer操作过程中产生的存储过程等数据。在一个SQLServer实例中,只有一个TempDB。所以容易成为性能和磁盘空间瓶颈。TempDB可能因为空间可用程度和过量的DDL和DML操作而变得超负荷。这可能导致不相关的应用运行缓慢甚至失败。

         常见的TempDB问题如下:

l  TempDB空间超支。

l  因为TempDB的I/O瓶颈而导致查询缓慢。这可以查看前面的I/O瓶颈章节。

l  过渡的DDL操作导致系统表产生瓶颈。

l  资源分配争用。

在开始诊断TempDB问题之前,先看看TempDB的空间是如何使用的。可以总结为4部分:

Category

Description

User Objects(用户对象)

由用户会话显式创建并且在系统目录中被跟踪的对象。包括:

表及索引;

全局临时表(##t1)及其索引;

局部临时表(#t1)及其索引;

会话(session)范围:包括会话范围及在存储过程中的范围;

表变量(@t1)范围:包括会话范围及在存储过程中的范围;

Internal Objects(内部对象)

这是语句范围的对象,存在和消失于SQLServer处理的查询中。包括:

工作文件(hash join);

运行排序;

工作表(游标、脱机(spool)和LOB(大对象数据类型)类型存储);

从优化角度,当工作表被删除时,一个IAM也和一个区将被保存用于新的工作表。

Version Store(版本存储)

这部分用于存储行版本、MARS、联机索引、触发器、基于快照的隔离级别的行版本。

Free Space(空余空间)

TempDB的可用空间

TempDB的总使用空间等于用户对象(userobjects)加上内置对象(internal objects)加上版本存储(version store)加上可用空间。

可用空间等于性能计数器中tempdb 的可用空间值。

 

监控Tempdb空间(Monitoring tempdb Space):

提早发现问题总比出现了再解决要强。你可以使用性能计数器:Free Space in tempdb(KB)来监控TempDB的空间使用情况。这个计数器按KB来跟踪TempDB。DBA可以使用这个指针来判断tempdb是否运行在低空间环境。但是,标识不同类别,就像签名定义的一样,tempdb使用磁盘空间的情况是非常丰富的。下面的查询返回tempdb被用户和内置对象使用情况,注意,这仅仅适用于tempdb:

 

Select

    SUM(user_object_reserved_page_count)*8 asuser_objects_kb,

    SUM(internal_object_reserved_page_count)*8 asinternal_objects_kb,

    SUM(version_store_reserved_page_count)*as version_store_kb,

    SUM(unallocated_extent_page_count)*8 as freespace_kb

From sys.dm_db_file_space_usage

Where database_id = 2

本机结果:

user_objects_kb     internal_objects_kb version_store_kb     freespace_kb

-------------------- ---------------------------------------- --------------------

NULL                NULL                 NULL                 NULL

注意这些数据是不包含混合区的计算,混合区被分配给用户和内置对象。

 

空间分配故障排查:

用户对象、内置对象和版本存储能引起tempdb的空间申请,下面我们看看如何检查每部分的故障问题。

用户对象(User objects):

因为用户对象不属于任何特定会话(specific sessions),你需要理解规范的应用程序应该根据特定的要求创建和调整用户对象。你可以通过