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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文: 第七章——DMVs和DMFs(3)——用DMV和DMF监控TempDB 前言:         我们都知道TempDB是SQLServer的系统数据库,且SQLServer的日常运作严重依赖这个库。
原文: 第七章——DMVs和DMFs(3)——用DMV和DMF监控TempDB

前言:

        我们都知道TempDBSQLServer的系统数据库,且SQLServer的日常运作严重依赖这个库。因此,监控TempDB的性能问题尤为重要。在过去很长一段时间里面,很多人都忽略了TempDB的重要性并忽略了它的性能问题。这并不是一件好事,因为TempDB的性能会影响其他用户数据库的性能,所以需要时时刻刻注意TempDB的性能。

        在一些查询的聚合、排序操作,游标操作和版本存储操作,联机索引创建,用户对象存储如临时表等,都将用到TempDB,作为DBA,需要经常监控TempDB,以便识别出资源消耗较大的操作。此时可以使用数据库相关的DMVs来完成。

        在使用这些DMVs时,要清楚一些基础概念,SQLServer是如何组织数据的。所以先来了解页和区。

就像你所知道的,SQLServer主要通过两类文件来存储数据库。就是数据文件(mdf/ndf)和日志文件(ldf)。这里只讨论数据文件。因为页和区不适用于日志文件。

        数据文件是SQLServer存储数据库的对象如表和索引的一种格式化文件。这些数据文件由更小的单元组成,这些单元叫做页。一个页存放8K的数据。

        另外,区也有页来存放,一个区有8个顺序页组成。所以,一个区有64K1MB16个区。

包含数据的对象会分配到区中的页上。有两类的区——统一区和混合区,一个统一区被一个单独对象所独有,混合区可以存放能够放进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表,可以得出一些对比信息,最后通过一个DMVsys.dm_db_file_space_usage。可以看出以MB为单位的分配情况。

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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
8月前
|
SQL 存储 Oracle
【SQL应知应会】表分区(一)• Oracle版
【SQL应知应会】表分区(一)• Oracle版
118 0
|
8月前
|
SQL Oracle 关系型数据库
【SQL应知应会】表分区(二)• Oracle版
【SQL应知应会】表分区(二)• Oracle版
115 0
|
8月前
|
SQL Oracle 关系型数据库
【SQL应知应会】行列转换(三)• Oracle版
【SQL应知应会】行列转换(三)• Oracle版
108 0
|
SQL 缓存 Oracle
《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一第1章 生成和显示执行计划
本节书摘来自华章出版社《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一 书中的第1章,作者:黄玮,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1370 0
|
SQL 存储 Oracle
《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一2.5 执行计划中其他信息的含义
本节书摘来自华章出版社《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一 书中的第2章,第2.5节,作者:黄玮,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1598 0
|
SQL 存储 Oracle
《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一1.2 显示执行计划
本节书摘来自华章出版社《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一 书中的第1章,第1.2节,作者:黄玮,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
954 0