一. 监控概述

  Tempdb库空间使用的一大特点,是只有一部分对象,例如用户创建的临时表、table变量等,可以用sys.allocation_units和sys.partitions这样的管理视图来管理,许多内部对象和版本存储在这些管理视图中没有体现,所以sp_spaceused的结果和真实的使用情况会有很大差异,tempdb的空间使用是不能用sp_spaceused来跟踪的。使用dbcc showfilestats 可以反映数据文件使用的整体情况,但不能监控到空间被谁以什么样的方式用掉。

  对于Tempdb的磁盘空间不足,可能会严重破坏 SQL Server 生产环境,并会使正在运行的应用程序无法完成操作。可以使用 sys.dm_db_file_space_usage 动态管理视图来监视 tempdb 文件中的这些功能使用的磁盘空间。此外,若要在会话级或任务级监视 tempdb 中的页分配或页释放活动,可以使用动态管理视图 sys.dm_db_session_space_usage 和 sys.dm_db_task_space_usage。这些视图可用于标识使用 tempdb 中大量磁盘空间的大型查询、临时表或表变量。还可以使用若干个windows性能计数器来监视 tempdb 中的可用空间以及使用 tempdb 的资源。

  (1)使用sys.dm_db_file_space_usage 视图能反映tempdb在几个大类里的空间使用分布, 使用sys.dm_db_session_space_usage 视图能反映tempdb在各会话中空间使用分布。(2)监控磁盘I/O来确认是否有瓶颈。(3)监视TempDB相关的DDL。

二. 监视tempdb空间分布

  2.1 sys.dm_db_file_space_usage视图

    使用该视图可以:返回数据库中每个文件的空间使用信息。下面例出该视图的主要信息,详细视图查看msdn。通过这个视图就能知道tempdb的空间是被哪一块对象使用掉的,是用户对象,还是内部对象,还是版本存储。

列名

数据类型

说明

database_id

smallint

数据库 ID

file_id

smallint

文件 ID

unallocated_extent_page_count

bigint

文件的未分配区中的总页数。

不包括已分配区中的未使用页

version_store_reserved_page_count

bigint

版本存储分配的统一区中的总页数

user_object_reserved_page_count

bigint

从统一区为数据库中的用户对象分配的总页数

internal_object_reserved_page_count

bigint

从统一区为文件中的内部对象分配的总页数

  2.2 sys.dm_db_session_space_usage视图

    使用该视图,能返回数据库每个会话分配和释放的页数。此视图仅适用于tempdb数据库。只有在任务结束时才更新计数器; 统计不反映正在运行的任务。

列名

数据类型

描述

SESSION_ID

SMALLINT

会话ID。

user_objects_alloc_page_count

BIGINT

此会话为用户对象保留或分配的页数

user_objects_dealloc_page_count

BIGINT

此会话取消分配且不再为用户对象保留的页数

internal_objects_alloc_page_count

BIGINT

此会话为内部对象保留或分配的页数

internal_objects_dealloc_page_count

BIGINT

此会话取消分配且不再为内部对象保留的页数。

user_objects_deferred_dealloc_page_count

BIGINT

已标记为延迟释放的页数。

  2.3 监视的sql脚本  

    对于监视tempdb三类对象空间分布,这里使用比较"轻量极"对系统影响不大的方法。通过间隔时间运行来监视空间使用,监视包括 DBCC,DMV,DMF 等,把结果输出到一个文件或数据库表里。

-- 间隔每秒执行一次,手工终止或加入作业
use tempdb
while 1=1
BEGIN select GETDATE() AS '当前时间' --------------query1 从文件级查看tempdb使用情况------------------
/*
TotalExtents 是磁盘占用的空间,一个extent为64k
UsedExtents 是磁盘使用的空间
*/
dbcc showfilestats ------------- query2 查看当前Tempdb各对象,占用总空间-------------
/*
user_object_reserved_page_count 用户对象包括: 临时表,表变量,表值函数中返回的表,定义的表和索引
internal_object_reserved_page_count 内部对象包括:排序段,哈希联接,游标
version_store_reserved_page_count 行版本包括: 触发器,运行联机索引,快照隔离级别或使用行版本控制
unallocated_extent_page_count:未分配空间(可用空间)
*/
select 'Tempdb' as DB, GETDATE() as [Time],
SUM(user_object_reserved_page_count)*8.0 as '用户对象占用总空间_kb',
SUM(internal_object_reserved_page_count)*8.0 as '内部对象占用总空间_kb',
SUM(version_store_reserved_page_count) * 8.0 as '行版本占用总空间_kb',
SUM(unallocated_extent_page_count) *8.0 as '未分配总空间_kb'
from sys.dm_db_file_space_usage
where database_id=2 -----------------query3 查询tempdb各会话,占用和释放的空间-------------
SELECT
t1.session_id,
(t1.internal_objects_alloc_page_count * 8.0) AS internal_objects_alloc_kb,
(t1.user_objects_alloc_page_count * 8.0)AS user_objects_alloc_kb,
(t1.internal_objects_dealloc_page_count* 8.0) AS internal_objects_dealloc_kb,
(t1.user_objects_dealloc_page_count * 8.0) AS user_objects_dealloc_kb
from sys.dm_db_session_space_usage as t1,
sys.dm_exec_sessions as t3
where t1.session_id = t3.session_id
and (t1.internal_objects_alloc_page_count >0
or t1.user_objects_alloc_page_count>0
or t1.internal_objects_dealloc_page_count>0
or t1.user_objects_dealloc_page_count>0)
and t1.session_id <>@@SPID -----------------query4 查询tempdb 各会话以及sql语句,占用空间-------------
/*
会话的内部对象和用户对象的保留或释放的页数
*/
SELECT t1.session_id,
(t1.internal_objects_alloc_page_count * 8.0) AS internal_objects_alloc_kb,
(t1.user_objects_alloc_page_count * 8.0)AS user_objects_alloc_kb,
(t1.internal_objects_dealloc_page_count* 8.0) AS internal_objects_dealloc_kb,
(t1.user_objects_dealloc_page_count * 8.0) AS user_objects_dealloc_kb,
st.text
from sys.dm_db_session_space_usage as t1,
sys.dm_exec_requests as t4
CROSS APPLY sys.dm_exec_sql_text(t4.sql_handle) AS st
where t1.session_id = t4.session_id
and t1.session_id >50
and (t1.internal_objects_alloc_page_count>0
or t1.user_objects_alloc_page_count >0
or t1.internal_objects_dealloc_page_count>0
or t1.user_objects_dealloc_page_count>0)
and t1.session_id <>@@SPID END

  监听如下图所示:

  2.4  行版本监控

      行版本是可以跨会话的,所以在sys.dm_db_session_space_usage中只有内部对象和用户对象所占用的空间查看。如果要监听和回收这部分空间,可使用下面脚本:

--(1)另外查询行版本运行最长的事务
select top 2
transaction_id,
transaction_sequence_num,
elapsed_time_seconds
from sys.dm_tran_active_snapshot_database_transactions
order by elapsed_time_seconds DESC --(2)根据得到当前会话
select session_id from sys.dm_tran_session_transactions where transaction_id=@transaction_id

三. 监视TempDB的I/O磁盘

  由于TempDB被多个地方广泛使用,有可能造成磁盘的消耗较大,成为I/O瓶颈。除了监视windows性能计数器,还有就是DMV视图。

  3.1 对于windows性能计数器主要包括三个

-- 每次数据传输的平均时间
AVG.Disk sec/Transfer
--磁盘读数据所需的平均时间
AVG.Disk sec/Read
--磁盘写数据所需的平均时间
AVG.Disk sec/Write

  3.2 DMV视图

    下面使用sys.dm_io_virtual_file_stats来确认IO瓶颈,它返回数据文件和日志文件的 I/O 统计信息,包括对文件发出的读取/写入次数以及总字节数, file_id字段中1 是数据文件,2是日志文件,脚本如下:

SELECT DB_NAME(database_id) AS 'DBName',
file_id,
io_stall_read_ms/num_of_reads AS 'Avg Read ms/Transfer',
io_stall_write_ms/num_of_writes AS 'Avg Write ms/Transfer'
FROM sys.dm_io_virtual_file_stats(NULL,null)
WHERE database_id=2

  下面是数据文件及日志文件性能指标建议列表,仅供参考

数据文件 日志文件
目标:<10ms 目标:<5ms
可接受:10 ~ 20 ms 可接受:5~15ms
不可接受:>20ms 不可接受:>15ms

四 监视TempDB相关的DDL

  DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上。对于大量,频繁地创建和删除临时表和表变量会引起元数据上的争用。在2008版本中在一定条件下局部临时表和表变量会被缓存,以减少元数据的争用。通过windows性能计数器或sys.dm_os_waiting_tasks 视图可以周期性的检查等待时间较长的会话。

  4.1 sys.dm_os_waiting_tasks

    使用该视图返回有关正在等待某些资源的任务的等待队列的信息。脚本如下

SELECT session_id,wait_duration_ms,resource_description,GETDATE()AS '当前时间'
FROM sys.dm_os_waiting_tasks
WHERE resource_description LIKE '2:%' AND wait_type LIKE 'PAGE%LATCH_%'
ORDER BY wait_duration_ms desc

  4.2 windows性能计数器

SQL Server:Access Methods\Workfiles Created/Sec
SQL Server:Access Methods\Worktables Created/Sec
SQL Server:Access Methods\Mixed Page Allocations/Sec
SQL Server:Access Methods\Temp Tables Created/Sec
SQL Server:Access Methods\Temp Tables for destruction

  最后还可参考msdn文档:解决 tempdb 中磁盘空间不足的问题

sql server 临时表(中) Tempdb监控的更多相关文章

  1. sql server 临时表(上) Tempdb概述

    一.概述 在sql server里临时表存储在TempDB库中,TempDB是一个系统数据库,它只有Simple恢复模式,也是最小日志记录操作.主要用于存放局部临时表,全局临时表,表变量,都是基于临时 ...

  2. SQL Server 2016里TempDb的提升

    几个星期前,SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0).这个预览版相比以前的CTP包含了很多不同的提升.在这篇文章里我会谈下对于SQL Ser ...

  3. SQL Server数据库中的系统数据库?

    SQL Server的系统数据库分为:master,model,msdb和tempdb 1.Master数据库 Master数据库记录SQL Server系统的所有系统级别信息(表sysobjects ...

  4. SQL Server 临时表和表变量系列之选择篇

    原文地址:https://yq.aliyun.com/articles/69187 摘要: # 摘要 通过前面的三篇系列文章,我们对临时表和表变量的概念.对比和认知误区已经有了非常全面的认识.其实,我 ...

  5. Oracle临时表和SQL Server临时表的不同点对比

    文章来源:http://www.codesky.net/article/201109/141401.html 1.简介 Oracle数据库除了可以保存永久表外,还可以建立临时表temporary ta ...

  6. SQL Server临时表的使用方案

      文章来源:http://www.codesky.net/article/201007/145241.html 我们今天是要和大家一起讨论的是SQL Server临时表的实用大全,如果你对SQL S ...

  7. SQL SERVER临时表的使用

    SQL SERVER临时表的使用 drop table #Tmp   --删除临时表#Tmpcreate table #Tmp --创建临时表#Tmp(    ID   int IDENTITY (1 ...

  8. 如何实现SQL Server临时表的创建?

    以下的文章主要是对SQL Server临时表的创建的实际操作步骤,以及在实际操作中我们要用到的实际应用代码的介绍,我在一个信誉度很好的网站找到一个关于其相关内容今天拿出来供大家分享. 创建临时表 方法 ...

  9. 在一个SQL Server表中的多个列找出最大值

    在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..# ...

随机推荐

  1. 三、自动化测试平台搭建-django-如何用mysql数据库做web项目

    从这节开始到后面说的大概内容如下: 这里说的是Django做一个web项目的大概框架,从下篇具体说Django中的模型(查询..),视图(请求,响应,cookie,session..),模板(验证码, ...

  2. cn microsoft hyper-v server 2016 安装笔记

    英文版,先用,随后 中文版再出笔记 不知道是不是 WINDOWS 7 USB DVD TOOLS 没有更新,怎么做不了优盘启动,只能找个 替代工具RUFUS.

  3. BZOJ5335 : [TJOI2018]智力竞赛

    二分答案,转化成求最少的路径,覆盖住所有权值$\leq mid$的点. 建立二分图,若$i$的后继为$j$,则连边$i\rightarrow j$,求出最大匹配,则点数减去最大匹配数即为最少需要的路径 ...

  4. SQLServer表、列备注管理

    在开发时,为了方便,在SQL SERVER库内对表名.列名进行备注,但在DB部署客户时,想一次清理上述备注值. 特编写如下 SQL,一次清除上述备注内容: declare @table nvarcha ...

  5. java保留小数-抄网上的

    摘抄别人的JAVA中保留小数点后若干位数的几种方法  2009-12-17 11:46:18|  分类: 编程小发现 |  标签: |举报 |字号大中小 订阅 第一种:java.text.Decima ...

  6. 4.DHCP与PRE

    如何配置IP地址 使用net-tools      $ sudo ifconfig eth1 10.0.0.1/24      $ sudo ifconfig eth1 up   使用Iproute2 ...

  7. XML语言1.简介和语法

    一.什么是XML语言? XML 指可扩展标记语言(Extensible Markup Language) Xml是独立于软件和硬件的信息传输工具. XML 是一种很像HTML的标记语言. 但xml不是 ...

  8. lucene 结合数据库做搜索

    package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedSta ...

  9. idea导入maven项目,找不到jar包,出现红色波浪线【转】

    参考链接 点击跳转

  10. gradle环境变量设置_配置注意事项

    看<Spring源码深度解析>的时候,在windows7系统中按照书里配置gradle环境变量,配置完后输入gradle -v,一直显示:'gradle'不是内部或外部命令,也不是可执行的 ...