思考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上恶补了一把,然后做一些简单的数据查询验证,以上内容完全是自己揣测的。
总体感觉,服务器规范化的管理和运营,可以避免一些不必要的麻烦。
@野蛮木木