1. 现象 使用Cacti监控,有关于临时表的一个图形 可以看到正在使用的临时表Active Temp Tables的数量非常大,并且在非工作时间,也维持在400个左右。感觉非常奇怪,所以追查下! 2. 探索 首先,先验证下Cacti数据是否准确,已知Cacti数据是从SQLServer的sys.
使用Cacti监控,有关于临时表的一个图形
可以看到正在使用的临时表Active Temp Tables的数量非常大,并且在非工作时间,也维持在400个左右。感觉非常奇怪,所以追查下!
首先,先验证下Cacti数据是否准确,已知Cacti数据是从SQLServer的sys.dm_os_performance_counters 计数器DMV中取数的。所以查询下数据:
select * from sys.dm_os_performance_counters where counter_name ='Active Temp Tables'
查询结果和图中展示数据没有差别
然后,查询下目前的临时表究竟有哪些。使用如下SQL:
<span>use</span><span> tempdb </span><span>go</span> <span>select</span> <span>*</span> <span>from</span><span> sys.objects </span><span>where</span> name <span>like</span> <span>'</span><span>#%</span><span>'</span> <span>order</span> <span>by</span> create_date <span>asc</span>
查询结果如下:
可以得出如下结论:
1) 临时表的数量与Cacti图中的数量基本一致
2)从临时表的命名来看,基本为表变量对应的临时表。因为若是创建的临时表,命名为#temp_xxxx_随机标识
3)很多临时表,基本是表变量对应的,创建日期为十几天前,且最近并未更改,但SQLServer一直为销毁
按照已有的知识,表变量在所在批处理语句结束后,就会释放掉,为什么会有如此的temp tables 未被销毁呢?
20140701补充:
见这篇博文 《TempDB--临时表的缓存》
解决问题的思路上,我之前也想过要查看临时表的内容,但临时表只在所属的会话内有效,无法查看内容,所以问题卡在这里。
上文给了一个思路是通过查看临时表中包含的列,通过表中列的内容,可以继续下一步的分析,直至问题的解决~
再次谢谢笑东风的回复!