在 tempdb sql 服务器中取消分配未使用的 space

Unallocate unused space in tempdb sql server

sql 服务器中用于查找 space 临时 tables 使用的任何脚本 + 在 tempdb 中创建临时 table 的数据库名称?

我的 tempDb 的大小已经增长到 100 GB,我无法恢复 space 并且我不确定是什么占用了这么多的 space。

感谢您的帮助。

也许您可以在临时数据库文件上单独使用以下 SQL 命令

DBCC SHRINKFILE

详情请参考https://support.microsoft.com/en-us/kb/307487

临时 tables 总是在 TempDb 中创建。但是,TempDb 的大小不一定只是由于临时 tables。 TempDb 的使用方式多种多样

  1. 内部对象(排序和假脱机、CTE、索引重建、散列连接等)
  2. 用户对象(临时 table、table 变量)
  3. 版本存储(AFTER/INSTEAD OF 触发器,MARS)

因此,很明显它被用于各种 SQL 操作中,因此大小也会由于其他原因而增长

您可以使用以下查询检查导致 TempDb 变大的原因

SELECT
 SUM (user_object_reserved_page_count)*8 as usr_obj_kb,
 SUM (internal_object_reserved_page_count)*8 as internal_obj_kb,
 SUM (version_store_reserved_page_count)*8  as version_store_kb,
 SUM (unallocated_extent_page_count)*8 as freespace_kb,
 SUM (mixed_extent_page_count)*8 as mixedextent_kb
FROM sys.dm_db_file_space_usage

如果上面的查询显示,

  • 更多的用户对象意味着有更多的使用 Temp tables ,游标或临时变量
  • 内部对象数量较多表示查询计划使用了大量数据库。例如:排序、分组依据等
  • 更多的版本存储显示长 运行 事务或高事务吞吐量

在此基础上,您可以配置 TempDb 文件大小。我最近写了一篇关于 TempDB 配置最佳实践的文章。你可以读到 here