日期:2014-05-16 浏览次数:20384 次
我们都知道TempDB是SQLServer的系统数据库,且SQLServer的日常运作严重依赖这个库。因此,监控TempDB的性能问题尤为重要。在过去很长一段时间里面,很多人都忽略了TempDB的重要性并忽略了它的性能问题。这并不是一件好事,因为TempDB的性能会影响其他用户数据库的性能,所以需要时时刻刻注意TempDB的性能。
在一些查询的聚合、排序操作,游标操作和版本存储操作,联机索引创建,用户对象存储如临时表等,都将用到TempDB,作为DBA,需要经常监控TempDB,以便识别出资源消耗较大的操作。此时可以使用数据库相关的DMVs来完成。
在使用这些DMVs时,要清楚一些基础概念,SQLServer是如何组织数据的。所以先来了解页和区。
就像你所知道的,SQLServer主要通过两类文件来存储数据库。就是数据文件(mdf/ndf)和日志文件(ldf)。这里只讨论数据文件。因为页和区不适用于日志文件。
数据文件是SQLServer存储数据库的对象如表和索引的一种格式化文件。这些数据文件由更小的单元组成,这些单元叫做页。一个页存放8K的数据。
另外,区也有页来存放,一个区有8个顺序页组成。所以,一个区有64K,1MB有16个区。
包含数据的对象会分配到区中的页上。有两类的区——统一区和混合区,一个统一区被一个单独对象所独有,混合区可以存放能够放进8个页的8个不同对象。因为混合区可以共享整个区,所以也叫做共享区。当表很小时,会放入混合区,直到足够大占据一个区时,混合区就会整合成一个统一区。
本文将演示如何监控TempDB的性能。同时可以识别出引起TempDB空间增加的会话和任务。
本文将产生1000万数据,并存放到TempDB的局部临时表中。然后监控页分配和重新分配的情况。
1、 连到SQLServer
2、 输入以下代码:
USE tempdb GO --检查表是否存在 IF OBJECT_ID('[dbo].[tbl_TempDBStats]') IS NOT NULL DROP TABLE [dbo].[tbl_TempDBStats] --创建表用于存放页分配的明细 CREATE TABLE [dbo].[tbl_TempDBStats] ( session_id SMALLINT , database_id SMALLINT , user_objects_alloc_page_count BIGINT , user_objects_dealloc_page_count BIGINT , internal_objects_alloc_page_count BIGINT , internal_objects_dealloc_page_count BIGINT ) GO --收集当前会话在执行查询之前的分配明细 INSERT INTO [dbo].[tbl_TempDBStats] SELECT session_id , databas