代码改变世界

SQLServer Temp tables 数据疑问

2014-06-30 15:52  JentleWang  阅读(1065)  评论(4编辑  收藏  举报

1. 现象

使用Cacti监控,有关于临时表的一个图形

可以看到正在使用的临时表Active Temp Tables的数量非常大,并且在非工作时间,也维持在400个左右。感觉非常奇怪,所以追查下!

2. 探索

首先,先验证下Cacti数据是否准确,已知Cacti数据是从SQLServer的sys.dm_os_performance_counters 计数器DMV中取数的。所以查询下数据:

 

select * 
from sys.dm_os_performance_counters 
where counter_name ='Active Temp Tables'

查询结果和图中展示数据没有差别

然后,查询下目前的临时表究竟有哪些。使用如下SQL:

use tempdb
go 
select * 
from sys.objects 
where name like '#%' 
order by create_date asc 

查询结果如下:

可以得出如下结论:

1) 临时表的数量与Cacti图中的数量基本一致

2)从临时表的命名来看,基本为表变量对应的临时表。因为若是创建的临时表,命名为#temp_xxxx_随机标识

3)很多临时表,基本是表变量对应的,创建日期为十几天前,且最近并未更改,但SQLServer一直为销毁

3.未解谜题

按照已有的知识,表变量在所在批处理语句结束后,就会释放掉,为什么会有如此的temp tables 未被销毁呢?

 

20140701补充:

 

4.问题答案

见这篇博文 TempDB--临时表的缓存

解决问题的思路上,我之前也想过要查看临时表的内容,但临时表只在所属的会话内有效,无法查看内容,所以问题卡在这里。

上文给了一个思路是通过查看临时表中包含的列,通过表中列的内容,可以继续下一步的分析,直至问题的解决~

再次谢谢笑东风的回复!