您的位置:首页 > 数据库 > 数据库管理

查看SQL SERVER中某个查询用了多少TempDB空间

更多 2016/6/26 来源:数据库管理学习浏览量:624
学习标签: SQL SERVER
本文导读:Tempdb 系统数据库是一个全局资源,供连接到 SQL Server 实例的所有用户使用。在现在的SQL Server数据库应用里,其使用频率可能会超过用户的想象。如果Tempdb空间使用过多,许多操作将不能完成,在数据库的维护中,我们可以通过查看SQL SERVER中某个查询用了多少TempDB空间,来查找性能方面的原因

一、TempDB系统数据库的理解

 

1、tempdb是SQL Server的系统数据库一直都是SQL Server的重要组成部分,用来存储临时对象。应用程序与数据库都可以使用tempdb作为临时的数据存储区。一个实例的所有用户都共享一个Tempdb,当多个应用程序的数据库部署在同一台服务器上的时候,应用程序共享tempdb,如果开发人员不注意对Tempdb的使用就会造成这些数据库相互影响从而影响应用程序。

 

2、tempdb全局存储内部对象,用户对象,临时表,临时对象,以及SQL Server操作创建的存储过程。每个数据库实例只有一个tempdb,所以可能存在性能以及磁盘空间瓶颈。各种形式的可用空间及过度的DDL/DML操作都会导致tempdb负载过重。这会导致运行在服务器上不相干程序运行缓慢或者运行失败。

 

3、在SQL Server中,TempDB主要负责

(1)、内部使用(排序、hash join、work table等)

一些比较复杂的查询中由于涉及到了大量的并行、排序等操作时就需要大量的内存空间,每一个查询在开始时都会由SQL Server预估需要多少内存,在具体的执行过程中,如果授予的内存不足,则需要将多出来的部分由TempDB处理


(2)、外部使用(临时表,表变量等)


(3)、行版本控制(乐观并发控制)

 

 

二、查看SQL SERVER中某个查询用了多少TempDB空间

 

 
SQL 代码   复制

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'

 

收藏
292
很赞
410