注意:这篇文章也可能有用:
TempDB mdf文件的问题越来越多
除非您能弄清楚正在使用该工作表的进程是什么(并且可以安全地杀死它),否则我必须同意您已经获得的搜索结果:循环服务器,并且应该能够缩小tempdb。
对于#temp表,需要解决一个不同的问题。我不知道它是否适合工作表:
查找哪个会话持有哪个临时表
我也为此写了博客(再次针对#temp表):
http://sqlperformance.com/2014/05/t-sql-queries/dude-who-owns-that-temp-table
我怀疑工作表与快照隔离/版本存储有关,但以防万一:
查找正在填充版本存储库的事务
另外,请不要依赖DBCC OPENTRAN;
-我已经观察到许多情况,在这些情况下,我知道我有一个活跃的事务,但是该事务没有显示。并注意数据库上下文很重要;事务处于活动状态的数据库不一定是tempdb。您在这里看到什么?有什么事吗
SELECT * FROM sys.dm_tran_active_transactions
WHERE name = N'worktable';
一旦缩小了tempdb
当然,这不是永久性的解决方案。您将收缩tempdb,然后它将再次增长。每当发生此游戏时,这可能会变得非常无聊且乏味。如果它再次增长,那么与此同时,您将如何处理这些空闲空间?租出它,然后在tempdb再次需要它时将其逐出?您需要:
- 首先修复使tempdb异常增大的过程。
- 为tempdb分配足够的空间,以便它不需要增长,并停止缩小它(尤其是只是暂时的;这只是浪费工作!)。
其他一些建议:
- 不要使用
SHRINKDATABASE
(应该称为自动片段化)或UI。编写特定的,有针对性的SHRINKFILE
命令以影响单个文件。
- 考虑为tempdb使用多个文件(如果可能,您可以将其分散到不同的存储中),并考虑跟踪标志1117(只要此行为也不会影响用户数据库)和1118。
- 这里有一些有关最小化tempdb利用率的提示: