第七章——DMVs和DMFs(3)——用DMV和DMF监控TempDB

原文:第七章——DMVs和DMFs(3)——用DMV和DMF监控TempDB

前言:

        我们都知道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 ,
                database_id ,
                user_objects_alloc_page_count ,
                user_objects_dealloc_page_count ,
                internal_objects_alloc_page_count ,
                internal_objects_dealloc_page_count
        FROM    sys.dm_db_session_space_usage
        WHERE   session_id = @@SPID
GO
--检查表是否存在
IF OBJECT_ID('TempDB.dbo.#tbl_SampleData') IS NOT NULL
    DROP TABLE TempDB.dbo.#tbl_SampleData
GO
--产生万数据并插入临时表
SELECT TOP 10000000
        SC1.object_id ,
        SC1.column_id ,
        SC1.name ,
        SC1.system_type_id
INTO    TempDB.dbo.#tbl_SampleData
FROM    sys.columns AS SC1
        CROSS JOIN sys.columns AS SC2
        CROSS JOIN sys.columns AS SC3
ORDER BY SC1.column_id
GO

--重新收集插入数据后的数据页分配情况
INSERT  INTO [dbo].[tbl_TempDBStats]
        SELECT  session_id ,
                database_id ,
                user_objects_alloc_page_count ,
                user_objects_dealloc_page_count ,
                internal_objects_alloc_page_count ,
                internal_objects_dealloc_page_count
        FROM    sys.dm_db_session_space_usage
        WHERE   session_id = @@SPID

 

 

3、 
然后输入以下代码,并注意执行前后的数据差异:

 

USE tempdb
GO
SELECT  *
FROM    [dbo].[tbl_TempDBStats]

 

 

4、 
结果如下:

 

5、 
运行以下查询查找TempDB空间分配情况:

 

SELECT  DB_NAME(FSU.database_id) AS DatabaseName ,
        MF.name AS LogicalFileName ,
        MF.physical_name AS PhysicalFilePath ,
        SUM(FSU.unallocated_extent_page_count) * 8.0 / 1024 AS Free_Space_In_MB ,
        SUM(FSU.version_store_reserved_page_count
            + FSU.user_object_reserved_page_count
            + FSU.internal_object_reserved_page_count
            + FSU.mixed_extent_page_count) * 8.0 / 1024 AS Used_Space_In_MB
FROM    sys.dm_db_file_space_usage AS FSU
        INNER JOIN sys.master_files AS MF ON FSU.database_id = MF.database_id
                                             AND FSU.file_id = MF.file_id
GROUP BY FSU.database_id ,
        FSU.file_id ,
        MF.name ,
        MF.physical_name

 

 

6、 
结果如下:

 

分析:

        在本文的开片中,首先创建了一个表tbl_TempDBStats以便存放页分配和释放的统计数据。然后通过查询sys.dm_db_session_space_usage,获取分析信息。把所有用户定义对象和系统内置对象都插入表中。

        下一个查询将产生1000万数据,并插入临时表#tbl_SampleData。使tempdb的分配情况发生改变。

        插入数据以后,检查tbl_TempDBStats表,可以得出一些对比信息,最后通过一个DMV,sys.dm_db_file_space_usage。可以看出以MB为单位的分配情况。

        注意:sys.dm_db_file_space_usage ,sys.dm_db_session_space_usage这两个DVM仅适用于tempdb。

时间: 2024-11-08 21:22:30

第七章——DMVs和DMFs(3)——用DMV和DMF监控TempDB的相关文章

第七章——DMVs和DMFs(2)——用DMV和DMF监控索引性能

原文:第七章--DMVs和DMFs(2)--用DMV和DMF监控索引性能   本文继续介绍使用DMO来监控,这次讲述的是监控索引性能.索引是提高查询性能的关键性手段.即使你的表上有合适的索引,你也要时时刻刻进行索引维护任务.   SQLServer有专门的DMO来显示索引相关统计信息.能帮助你分析现有索引的性能情况.通过这些DMO,可以做到: Ø  检查索引使用模式 Ø  查找丢失索引 Ø  查找无用索引 Ø  查找索引碎片 Ø  分析索引页分配明细 本文将使用这些DMO来检查数据库的丢失索引,

第七章——DMVs和DMFs(4)——用DMV和DMF监控磁盘IO

原文:第七章--DMVs和DMFs(4)--用DMV和DMF监控磁盘IO 前言:         本文为本系列最后一篇,作为DBA,你必须经常关注磁盘的I/O问题,一旦出现问题,要尽快分析出是什么问题.SQLServer同样提供了一些列与I/O相关的DMO来做监控.         本文介绍如何使用DMO来监控I/O子系统的性能并找到I/O瓶颈.通过本文,可以区分不同数据库的I/O使用模式.一旦发现有数据库的I/O很高,可能需要考虑把数据库迁移到单独的磁盘,或者深入研究I/O产生的问题.   准

第七章——DMVs和DMFs(1)

原文:第七章--DMVs和DMFs(1) 简介:         从SQLServer2005开始,微软引入了一个名叫DMO(动态管理对象)的新特性,DMO可以分为DMFs(Dynamic Manage Functions,动态管理函数)和DMVs(Dynamic Manage Views,动态管理视图)两部分.这些函数和视图用于查找SQLServer实例内部统计信息以供性能监控所用.它们提供实时的,关于SQLServer内部工作的,能用于性能分析和性能故障排除的各种统计信息.        

struct-C++primer第五版关于第七章类的一个问题

问题描述 C++primer第五版关于第七章类的一个问题 #include #include using namespace std; struct Sales_data{ Sales_data()=default; Sales_data(const string &s):bookNo(s){} Sales_data(const string &s,unsigned n,double p): bookNo(s),units_sold(n),revenue(p*n) {} Sales_dat

> 第七章 异常处理(rainbow 翻译) (来自重粒子空间)

<<展现C#>> 第七章 异常处理(rainbow 翻译) 出处:http://www.informit.com/matter/ser0000002 正文: 第七章   异常处理     通用语言运行时(CLR)具有的一个很大的优势为,异常处理是跨语言被标准化的.一个在C#中所引发的异常可以在Visual Basic客户中得到处理.不再有 HRESULTs  或者 ISupportErrorInfo 接口.    尽管跨语言异常处理的覆盖面很广,但这一章完全集中讨论C#异常处理.你

《.net编程先锋C#》第七章 异常处理(转)

编程|异常处理 第七章 异常处理通用语言运行时(CLR)具有的一个很大的优势为,异常处理是跨语言被标准化的.一个在C#中所引发的异常可以在Visual Basic客户中得到处理.不再有 HRESULTs 或者 ISupportErrorInfo 接口.尽管跨语言异常处理的覆盖面很广,但这一章完全集中讨论C#异常处理.你稍为改变编译器的溢出处理行为,接着有趣的事情就开始了:你处理了该异常.要增加更多的手段,随后引发你所创建的异常. 7.1 校验(checked)和非校验(unchecked)语句当

Android群英传笔记——第七章:Android动画机制和使用技巧

Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中十分重要的一部分,从早期的Android版本中,由于动画机制和绘图机制的不健全,Android的人机交互备受诟病,Android从4.X开始,特别是5.X,动画越来越完善了,Google也开始重视这一方面了,我们本章学习的主要内容有 Android视图动画' Android属性动画 Android动

Knockout应用开发指南 第七章:Mapping插件

原文:Knockout应用开发指南 第七章:Mapping插件 Mapping插件 Knockout设计成允许你使用任何JavaScript对象作为view model.必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元素上,当这些observable值改变的时候,这些UI元素就会自动更新. 绝大多数程序都需要从服务器端获取数据,但是由于服务器不知道observable的概念是什么,它只支持简单的JavaScript对象(通常是序列化以后的JSON),

【原创】构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测CLR性能

原文:[原创]构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)-托管资源优化-监测CLR性能 构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)-托管资源优化-监测CLR性能     前言:在上一篇文章中讲述了一些垃圾回收的一些知识,本篇就讲述如何来监测CLR是否导致了一些性能问题.    本篇的议题如下: 内存问题概述(前篇) 托管资源优化(前篇)          对象的生命周期(前篇)          对象的"代"(前篇)          大