SqlServer 一个查询语句导致tempdb增大55G

今天操作着服务器,突然右下角提示“C盘空间不足”!

吓一跳!~

看看C盘,还有7M!!!这么大的C盘空间怎么会没了呢?搞不好等下服务器会动不了!

第一反应就想可能是日志问题,很可能是数据库日志问题

于是查看日志,都不大,正常。

dbcc sqlperf(logspace)

看看系统报错:

是tempdb问题,但是刚才看日志才几M,根据提示查看日志状态:

select name,log_reuse_wait_desc from sys.databases 

数据库日记现在没什么操作,可能是执行完了。

活动的虚拟日志也不多,10个左右:

dbcc loginfo

查看当前tempdb情况,吓一跳啊,tempdb数据文件55G! 看上面的图,也就是突然增长的。

于是马上收缩日志,收缩数据文件,收缩出1G左右。

还是不行,继续不断地更改大小不断收缩,只要小于55G都改数据进行收缩,竟然还能收缩了9G!

DBCC SHRINKFILE (N'tempdev' , 1024)--单位为MB
DBCC SHRINKDATABASE (tempdb, 1024);--单位为MB

暂时缓解了,看来是收缩不了了。都说得重启服务器才行,当前连接较多,没有重启.所以先查查什么原因引起的。

查看当前的各种游标,SQL ,堵塞等,没发现什么,事务应该执行完了。

查看tempdb记录的分配情况:

use tempdb
go
SELECT top 10 t1.session_id,
t1.internal_objects_alloc_page_count,  t1.user_objects_alloc_page_count,
t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count,
t3.login_name,t3.status,t3.total_elapsed_time
from sys.dm_db_session_space_usage  t1
inner join sys.dm_exec_sessions as t3
on t1.session_id = t3.session_id
where (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)
order by t1.internal_objects_alloc_page_count desc

有四个关键信息:

session_id :稍等可以查询该session的相关信息

internal_objects_alloc_page_count  :分配给session内部对象的数据页

internal_objects_dealloc_page_count :已经释放的数据页

login_name : 该session的登录名

从internal_objects_alloc_page_count  和internal_objects_dealloc_page_count可以看出,给session分配了7236696页,计算一下:

select 7236696*8/1024/1024 as [size_GB]

竟然为55G,几乎和tempdb增长的大小一致,可以断定就是这个session引起的。internal_objects_dealloc_page_count 可以看到已经释放了,暂用tempdb的数据已经释放了。

通过登录名,已经知道谁在操作了。(这就是给每个相关人员自己登录名的好处之一,可以很快追踪使用者,是内部人员操作)

现在看看这session_id的用处:

select p.*,s.text
from master.dbo.sysprocesses p
cross apply sys.dm_exec_sql_text(p.sql_handle) s
where spid = 1589

看到最后有一条语句:

拷贝出来,几乎是数据库中最大的 8个表做inner join 连接 查询!!

代码就不贴出来了。

目前已经查出什么原因导致了tempdb增大的问题。tempdb从55285MB收缩为47765MB,但大小问题得晚点重启服务在看看了。

时间: 2024-10-01 04:32:25

SqlServer 一个查询语句导致tempdb增大55G的相关文章

SqlServer 一个查询语句以致tempdb增大55G (转载)

SqlServer 一个查询语句导致tempdb增大55G 今天操作着服务器,突然右下角提示“C盘空间不足”! 吓一跳!~ 看看C盘,还有7M!!!这么大的C盘空间怎么会没了呢?搞不好等下服务器会动不了! 第一反应就想可能是日志问题,很可能是数据库日志问题 于是查看日志,都不大,正常. dbcc sqlperf(logspace) 看看系统报错: 是tempdb问题,但是刚才看日志才几M,根据提示查看日志状态: select name,log_reuse_wait_desc from sys.d

一个查询交易导致数据库CPU使用率高的问题

这一阵子在做一个查询交易的压力测试,使用的AIX+informix数据库.应用和数据库分别部署在两台机器上.使用loadrunner进行并发测试.相关表的历史数据是20W级别的.使用20个并发进行测试. 测试过程中,应用服务器负载正常,数据库服务器磁盘.网络使用率正常,但是CPU使用率却是98%左右.觉得很奇怪,因为这台机器是测试环境中性能最好的,表现不应该如此.于是先猜测会不会是informix的参数配置不对,于是搜了些informix参数中影响CPU使用率的参数调了一遍,但是现象依旧.对里面

一个查询语句引发的死锁

程序错误日志大量的报死锁错误,去数据库错误日志查看确实有很多死锁(应在数据库实例启动时执行dbcc traceon(1222,-1)开启死锁跟踪): 04/29/2016 14:07:51,spid33s,δ?,waiter id=process71da6bb88 mode=IX requestType=wait 04/29/2016 14:07:51,spid33s,δ?,waiter-list 04/29/2016 14:07:51,spid33s,δ?,owner id=process5b

Oracle查询语句导致CPU使用率过高问题处理

解决此问题的关键在于如何找到造成CPU使用率过高的SQL语句.步骤如下: 1.使用Process Explorer工具查看到Oracle进程,双击Oracle进程,在弹出的属性窗口的Threads选项卡中查看占用CPU较高的线程号(TID). 2.在PL/SQL工具中执行以下SQL语句: --根据sql_id获取对应的Sql语句(sql_text,sql_fulltext)select * from v$sqlarea where sql_id in ( --根据addr获取sql_id sel

智能将SqlServer的查询语句转换为分页语句

主要用到了jsqlparser,前面有篇博客介绍过: JAVA - Sql解析工具jsqlparser简单使用 为了给Mybatis分页插件增加对sqlserver的支持,专门写了这样一个独立的工具,只依赖jsqlparser. 这个类不仅是为了给分页插件使用的,他还能独立使用,使用它你可以方便的生成一个分页查询. 分页插件地址:Mybatis_PageHelper SqlServer分页转换完整代码:com/github/pagehelper/SqlServer.java 简单讲一下处理的逻辑

SQLServer 统计查询语句消耗时间

--方法1[set statistic ]: set statistics time on go --执行语句 xxxx go set statistics time off --方法2[getDate()]: DECLARE @begin dateTime DECLARE @end dateTime SET @begin=getdate(); BEGIN --执行语句 xxxx end set @end=getdate(); SELECT datediff(ms,@begin,@end) as

Mysql查询语句使用select.. for update导致的数据库死锁分析

近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁住获取数据的数据段,保证多台机器不拿到相同的数据. 我们Mysql的存储引擎是innodb,支持行锁.解决同时拿数据的方法有很多,为了更加简单,不增加其他表和服务器的情况下,我们考虑采用select... for update的方式,这样X锁锁住查询的数据段,表里其他数据没有锁,其他业务逻辑还是可以操作. 这样一台服务器比如select .. for upd

SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划

我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为复用执行计划的性能比生成执行计划的性能要高很多,所以SqlServer的这一特性可以大大提高Sql语句的执行效率.特别是对于存储过程,因为存储过程的执行计划是在存储过程第一次执行的时候生成的,存储过程的执行计划生成后就会被缓存到SqlServer的执行计划列表中,如果以后存储过程再被执行,那么存储过

转载《mysql 一》:mysql的select查询语句内在逻辑执行顺序

原文:http://www.jellythink.com/archives/924 我的抱怨 我一个搞应用开发的,非要会数据库,这不是专门的数据库开发人员干的事么?话说,小公司也没有数 据库开发人员这么个职位吧.好吧,对数据库最深的印象还停留在大学<数据库原理>这堂课上,什么第一范式,第二范式…,这些理论的东西,多多少少还是记得 点,至于更深层次的,我不会.所以呢,撸起袖子,开始学习吧. 干程序员,最不怕的就是学习,如果你连学习都怕了,那还是早点退出这行吧.你说是吧.而我今天这篇文章,既不总结