野蛮木木原创 转载请注明出处和链接

思考SQL Server三十问之三诊断tempdb

3. 有哪些操作会使用到TempDB;如果TempDB异常变大,可能的原因是什么,该如何处理;

 

思考:

在过去使用Sql server2005的时候,更多是关注model,为了实现标准化的东西;自从在mysql上碰到一些存在性能问题的服务器之后,才开始注重mssql的性能;

然而现在很少有机会去做mssql的性能优化。tempdb在使用临时表、表变量的过程中尤为需要注意。

 

1) 有哪些操作会使用到TempDB

    tempdb 数据库用于存储下列对象:用户对象、内部对象和版本存储区。MSDN上拥有更加详细的例子。

http://msdn.microsoft.com/zh-cn/library/ms345368(SQL.100).aspx

 

2) 如果TempDB异常变大,可能的原因是什么,该如何处理

 了解了tempdb存储的数据对象的是那些之后,这个时候处理异常增大的时候就有方向了。

 一、确定空间占用的对象类型

version_store_reserved_page_count:基于行版本存储使用页

user_object_reserved_page_count:用户对象

internal_object_reserved_page_count:系统内部对象

mixed_extent_page_count:已分配的混合分区,包含使用和未使用的页

1 -- 通过这个SQL来查询当前占用tempdb空间主要来源那块
2 select * from sys.dm_db_file_space_usage;
3 
4 /*  -- result
5 database_id    file_id    unallocated_extent_page_count    version_store_reserved_page_count    user_object_reserved_page_count    internal_object_reserved_page_count    mixed_extent_page_count
6 2    1    488    0    368    8    160
7 2    5    192    0    176    0    16
8 */

 二、检查session对tempdb的使用情况

-- 检查各task 使用tempdb的情况
select *, user_objects_alloc_page_count - user_objects_dealloc_page_count as USED
  from sys.dm_db_task_space_usage
 where session_id > 50
order by USED desc;

三、 针对出现问题的session在具体情况,具体分析了

  3.1 用户对象:临时出现大量的,临时对象存储的数据量比较大,正式上线的业务,应避免这样的情况发生。

  3.2 内部对象:出现这种情况,应该从大量数据的查询着手,一般count得到的数据量都比较大。

  3.3 版本存储区:可能是大量的前端数据载入有关...

这个时候,常常为了保证业务的正常运行,该kill 某session 就kill...

 

 

当看到关于tempdb的知识,赶紧去msdn上恶补了一把,然后做一些简单的数据查询验证,以上内容完全是自己揣测的。

总体感觉,服务器规范化的管理和运营,可以避免一些不必要的麻烦。

@野蛮木木

posted on 2012-05-22 14:01  野蛮木木  阅读(612)  评论(0编辑  收藏  举报