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

最近帮助客户调优的过程中,发现客户的TempDB存在非常大的压力,经过排查是发现某些语句对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。

时间: 2024-12-26 14:44:22

如何查看某个查询用了多少TempDB空间的相关文章

[转载]如何查看某个查询使用了多少TempDB空间

http://www.cnblogs.com/CareySon/p/3910337.html 通过下面脚本可以查看某个查询实用的TempDB的空间. 第一步是查询出当下TempDB实用空间是多少, 第二步是执行某查询语句 第三步是用当先TempDB空间-第一步TempDB实用的空间. DECLARE @read BIGINT, @write BIGINT ; SELECT @read = SUM(num_of_bytes_read), @write = SUM(num_of_bytes_writ

如何查看Navicat 查询结果

Navicat for MySQL 提供 Navicat Cloud 服务给用户,同步连接设置.模型.查询和虚拟组到云.这样就能随时随地实时访问.有了 Navicat Cloud,便可以善用一天中的每分每秒,最大限度提高工作效率.下面讲讲如何查看Navicat 查询结果?Navicat 运行查询,在工具栏中点击“运行”按钮,如果查询语句完全正确,该查询将被运行,并在结果选项卡返回相应的查询数据:如果运行查询时发生错误,运行停止,并显示相应的错误信息. Navicat 查询结果 结果选项卡以网格显

[转]如何监测谁用了SQL Server的Tempdb空间

Tempdb 系统数据库是一个全局资源,供连接到 SQL Server 实例的所有用户使用.在现在的SQL Server里,其使用频率可能会超过用户的想象.如果Tempdb空间耗尽,许多操作将不能完成. 作为一个支持工程师,会被经常问到象“我的Tempdb为什么这么大?”“是谁把我的Tempdb空间用完的?”在SQL 2000的时候,这个问题很难回答.好在SQL 2005以后,引入了一张新的管理视图:sys.dm_db_file_space_usage.通过查询这张视图,能了解tempdb的空间

linux下使用 du查看某个文件或目录占用磁盘空间的大小

du -ah --max-depth=1     这个是我想要的结果  a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度. du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du -sh 一.du的功能:`du` reports the amount of disk space used by the specified files and for each subdirectory (of directory argum

MySQL中查询所有数据库占用磁盘空间大小和单个库中所有表的大小的sql语句

查询所有数据库占用磁盘空间大小的SQL语句: select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' MB') as data_size, concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size from information_schema.tables group by TABLE_SCHEMA order by data_lengt

如何查看SQLServer数据库每个表占用的空间大小?

如何查看SQLServer数据库每个表占用的空间大小? 创建存储过程: CREATE PROCEDURE [dbo].[sys_viewTableSpace]AS BEGIN SET NOCOUNT ON; CREATE TABLE [dbo].#tableinfo( 表名 [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, 记录数 [int] NULL, 预留空间 [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,

[转帖]linux下使用 du查看某个文件或目录占用磁盘空间的大小

du -ah --max-depth=1 去年用过一次 后来忘记了.. 命令这个东西 熟能生巧.. https://www.cnblogs.com/kobe8/p/3825461.html du -ah --max-depth=1     这个是我想要的结果  a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度. du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du -sh 一.du的功能:`du` reports the

MSSQL 2005 如和查询所有Table使用的空间

最近在整理之前工作时后的一些东西,刚好看到当时因为想观察各个Table成长速度所产生的语法 贴出来这边跟大家分享一下 ( Table_Name sysname,笔数 int , 保留空间 varchar(10), 使用空间 varchar(10), 索引使用空间 varchar(10), 未用空间 varchar(10)) insert into #tb exec sp_MSforeachtable 'EXEC sp_spaceused ''?''' select * from #tb go d

MySQL中如何查看“慢查询”,如何分析执行SQL的效率?

一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短. 3,slow_query_log_file记录日志的文件名. 4,log_queries_not_using_indexes这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快. 二