第七章——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。
第七章——DMVs和DMFs(3)——用DMV和DMF监控TempDB的更多相关文章
- 第七章——DMVs和DMFs(4)——用DMV和DMF监控磁盘IO
原文:第七章--DMVs和DMFs(4)--用DMV和DMF监控磁盘IO 前言: 本文为本系列最后一篇,作为DBA,你必须经常关注磁盘的I/O问题,一旦出现问题,要尽快分析出是什么问题.SQLServ ...
- 第七章——DMVs和DMFs(2)——用DMV和DMF监控索引性能
原文:第七章--DMVs和DMFs(2)--用DMV和DMF监控索引性能 本文继续介绍使用DMO来监控,这次讲述的是监控索引性能.索引是提高查询性能的关键性手段.即使你的表上有合适的索引,你也要时时刻 ...
- 第七章——DMVs和DMFs(1)
原文:第七章--DMVs和DMFs(1) 简介: 从SQLServer2005开始,微软引入了一个名叫DMO(动态管理对象)的新特性,DMO可以分为DMFs(Dynamic Manage Functi ...
- KnockoutJS 3.X API 第七章 其他技术(2) 使用扩展器来增加可观察量(监控属性)
Knockout observables提供了支持读取/写入值并在值改变时通知订阅者所需的基本功能. 但在某些情况下,您可能希望向可观察者添加其他功能. 这可能包括通过在可观察者前面放置一个可写的计算 ...
- 精通Web Analytics 2.0 (9) 第七章:失败更快:爆发测试与实验的能量
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第七章:失败更快:爆发测试与实验的能量 欢迎来到实验和测试这个棒极了的世界! 如果Web拥有一个超越所有其他渠道的巨大优势,它就 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...
- 《Entity Framework 6 Recipes》中文翻译系列 (41) ------ 第七章 使用对象服务之标识关系中使用依赖实体与异步查询保存
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-7 标识关系中使用依赖实体 问题 你想在标识关系中插入,更新和删除一个依赖实体 ...
- Java语言程序设计(基础篇) 第七章 一维数组
第七章 一维数组 7.2 数组的基础知识 1.一旦数组被创建,它的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 2.数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储 ...
- objective-c第七章课后练习2
题:改变第七章例子中print方法,增加bool参数,判断如果是YES则对分数进行约简 @interface Fraction : NSObject { //int num,den; } @prope ...
随机推荐
- 利用泛型抽取Dao层,加事务注解问题(java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType)
想利用泛型抽取BaseDao层,简化操作时出现故障: @Transactional这个注解是能够继承的.于是就想写在抽取的BaseDao层上,让实现的类能够不用写@Transactional,就可开启 ...
- 基于.net开发chrome核心浏览器【二】
原文:基于.net开发chrome核心浏览器[二] 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一] 二: 相关资源介绍: chrome Frame: 让IE有一颗chrome的心, ...
- 【Android Training - UserInfo】记住登入用户的信息[Lesson 1 - 使用AccountManager来记住用户]
Remembering Your User[记住你的用户] 每一个人都非常喜欢自己的名字能被人记住.当中最简单,最有效的使得你的app让人喜欢的方法是记住你的用户是谁,特别是当用户升级到一台新的设备或 ...
- 从零開始学android<ImageSwitcher图片切换组件.二十六.>
ImageSwitcher组件的主要功能是完毕图片的切换显示,比如用户在进行图片浏览的时候.能够通过button点击一张张的切换显示的图片,并且使用ImageSwitcher组件在每次切换的时候也能够 ...
- Javascript语言精粹之String常用方法分析
Javascript语言精粹之String常用方法分析 1. String常用方法分析 1.1 String.prototype.slice() slice(start,end)方法复制string的 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...
- JSP生成word文件
1.jsp生成word文件,直接改动jsp格式: <%@ page contentType="application/vnd.ms-word;charset=GB2312"% ...
- UltraEdit-32 温馨提示:右协会,取消 bak文件
1.最近安装UltraEdit-32 无权协会,能够 高级 ->组态 ->文件关联 在 检查 继承到资源管理器 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...
- 更具体的描述JNI
JNI事实上,Java Native Interface缩写,也就是说,java本地接口. 它提供了许多API实现和Java并与其他语言的沟通(主要C&C++). 也许很多人认为Java够劲. ...
- HashMap的遍历和排序
1.HashMap的遍历 package com.sheepmu; import java.util.HashMap; import java.util.Iterator; import java.u ...