如何查看SQLSERVER中某个查询用了多少TempDB空间

在SQL Server中,TempDB主要负责供下述三类情况使用:

内部使用(排序、hash join、work table等)
外部使用(临时表,表变量等)
行版本控制(乐观并发控制)
 
    而对于内部使用,一些比较复杂的查询中由于涉及到了大量的并行、排序等操作时就需要大量的内存空间,每一个查询在开始时都会由SQL Server预估需要多少内存,在具体的执行过程中,如果授予的内存不足,则需要将多出来的部分由TempDB处理,这也就是所谓的Spill to TempDB。

通过下述语句可以观察到某个查询对TempDB造成了多少读写:

DECLARE @read  BIGINT,
    @write BIGINT
;
SELECT @read = SUM(num_of_bytes_read),
    @write = SUM(num_of_bytes_written)
FROM  tempdb.sys.database_files AS DBF
JOIN  sys.dm_io_virtual_file_stats(2, NULL) AS FS
    ON FS.file_id = DBF.file_id
WHERE  DBF.type_desc = 'ROWS'

--这里放入需要测量的语句

SELECT tempdb_read_MB = (SUM(num_of_bytes_read) - @read) / 1024. / 1024.,
    tempdb_write_MB = (SUM(num_of_bytes_written) - @write) / 1024. / 1024.,
    internal_use_MB =
      (
      SELECT internal_objects_alloc_page_count / 128.0
      FROM  sys.dm_db_task_space_usage
      WHERE  session_id = @@SPID
      )
FROM  tempdb.sys.database_files AS DBF
JOIN  sys.dm_io_virtual_file_stats(2, NULL) AS FS
    ON FS.file_id = DBF.file_id
WHERE  DBF.type_desc = 'ROWS'

最近在一个客户那里看到的烂查询所导致的TempDB使用结果如下:


 
    使用该查询就可以帮助了解某个语句使用了多少TempDB。

(0)

相关推荐

  • sqlserver 游标的简单示例

    Declare @Id varchar(20) Declare @Name varchar(20) Declare Cur Cursor For select substring(id,0,7) as id,name from temp1 Open Cur Fetch next From Cur Into @Id,@Name While @@fetch_status=0 Begin Update temp Set [c3]=@Name where [id] like @Id+'%' Fetch

  • SQL Server使用游标处理Tempdb究极竞争-DBA问题-程序员必知

    SQL Server tempdb分配竞争算是DBA老生常谈的问题了,几乎现在所有的DBA都知道多建几个文件来解决/缓解问题.但是深层次的的竞争依旧不可避免.这里给大家剖析下游标在tempdb中的特点使其在一定场景下替代临时表/表变量对象,解决深层次的tempdb竞争问题. 在抛出这个不可避免的问题之前我们先简要看下什么是tempdb竞争. 我们拿SQL Server创建一个临时表的过程来描述 1 在系统表中创建表的条目(系统数据页中) 2 分配一个IAM页并找到一个混合区在PFS页中标记 3

  • SqlServer数据库提示 “tempdb” 的日志已满 问题解决方案

    执行sql 语句,中间没有用到临时表 提示服务器: 消息 9002,级别 17,状态 2,行 1 数据库 'tempdb' 的日志已满.请备份该数据库的事务日志以释放一些日志空间. 网上找了下解决方案,大体是扩大临时库的日志文件的大小解决的 解决过程: 查看了下数据库的属性,是自动增长,不指定文件大小上限. 在网上Google了很久,试了些方法都不行:数据库所在磁盘还有很大的可用空间,试着下重药了. 直接把tempdb的数据文件和日志文件的大小改为3000M, 问题解决. 记录一下清空日志的命令

  • sqlserver游标使用步骤示例(创建游标 关闭游标)

    游标(cursor)是一个存储在DBMS服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集.在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据. 使用游标 使用游标的步骤: 在使用游标前,必须声明(定义)它.这个过程实际上没有检索数据,它只是定义要使用的SELECT语句和游标选项.一旦声明,就必须打开游标以供使用.这个过程用前面定义的SELECT语句把数据实际检索出来.对于填有数据的游标,根据需要取出(检索)各行.在结束游标使用时,必须关闭游标,可能的话,释放

  • 浅谈tempdb在SqlServer系统中的重要作用

    简介: tempdb是SQLServer的系统数据库一直都是SQLServer的重要组成部分,用来存储临时对象.可以简单理解tempdb是SQLServer的速写板.应用程序与数据库都可以使用tempdb作为临时的数据存储区.一个实例的所有用户都共享一个Tempdb.很明显,这样的设计不是很好.当多个应用程序的数据库部署在同一台服务器上的时候,应用程序共享tempdb,如果开发人员不注意对Tempdb的使用就会造成这些数据库相互影响从而影响应用程序. 特性: 1. tempdb中的任何数据在系统

  • sqlserver中触发器+游标操作实现

    复制代码 代码如下: Create trigger tri_wk_CSVHead_History on wk_CSVHead_History --声明一个tri_wk_CSVHead_History触发器, instead of insert ---插入操作被代替执行下面的操作 as begin declare YB cursor --声明一个游标 for select NoteNO from inserted--这里的NoteNO要和下面的匹配 open YB declare @NoteNO

  • sqlserver 函数、存储过程、游标与事务模板

    1.标量函数:结果为一个单一的值,可包含逻辑处理过程.其中不能用getdate()之类的不确定性系统函数. 复制代码 代码如下: --标量值函数 -- ================================================ -- Template generated from Template Explorer using: -- Create Scalar Function (New Menu).SQL -- -- Use the Specify Values for

  • SqlServer提示“列前缀tempdb.无效: 未指定表名”问题解决方案

    在查询凭证.审核凭证时出现"列前缀tempdb.无效: 未指定表名"的错误提示,怎么解决? 原因:是因为SQL2000无法识别计算机名称中"-"."."以及中文字等特殊字符, 只能使用英文字母及数字. 解决:右键我的电脑"属性"中"计算机名"点击修改,改为纯英文(最好8位以内),切记计算机名不能带".-"等字符.就可以解决了. 将这个问题改过来之后, 又有问题随之而来: 用友系统管理中注

  • SqlServer中tempdb的日志机制原理解析及示例分享

    测试用例 我们分别在用户数据库(testpage),tempdb中创建相似对象t1,#t1,并在tempdb中创建创建非临时表,然后执行相应的insert脚本(用以产生日志),并记录执行时间用以比较用以比较说明tempdb"快" Code 用户数据库testpage use testpage go create table t1 ( id int identity(1,1) not null, str1 char(8000) ) declare @t datetime2=sysutcd

  • SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)

    当我们需要批量删除数据库中的表时,对于单个删除一些表是否感到烦躁,厌倦,干脆写个脚本用得了. 本脚本使用游标循环删除,对于数量比较小,用游标暂不会造成恶劣影响. 复制代码 代码如下: DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ONLY FORSELECT name FROM sysobjects WHERE name LIKE 'PUB%' A

随机推荐