【问题标题】:Unallocate unused space in tempdb sql server在 tempdb sql server 中取消分配未使用的空间
【发布时间】:2015-09-14 10:12:10
【问题描述】:

sql server 中的任何脚本来查找临时表使用的空间 + 在 tempdb 中创建该临时表的数据库名称?

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

感谢您的帮助。

【问题讨论】:

    标签: sql-server tempdb


    【解决方案1】:

    临时表总是在 TempDb 中创建。但是,TempDb 的大小不必仅取决于临时表。 TempDb 的使用方式多种多样

    1. 内部对象(排序和假脱机、CTE、索引重建、哈希连接等)
    2. 用户对象(临时表、表变量)
    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
    

    如果上面的查询显示,

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

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

    【讨论】:

    • 感谢 Anuj 提供的详细信息,它确实提供了丰富的信息。在我的情况下,临时数据库正在增长,同时运行一个脚本,该脚本具有一个带有重复条目的表的连接语句。它一定增加了您提到的内部对象的数量。
    【解决方案2】:

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

    DBCC SHRINKFILE
    

    更多信息请参考https://support.microsoft.com/en-us/kb/307487

    【讨论】:

    • 感谢 Eralper,但我想先了解每个临时表的大小以及创建这些表的原因。
    • 请查看以下教程kodyaz.com/articles/… 已经构建了执行 sp_MSForEachTable 的代码,其中 sp_spaceused 用于数据库中的所有表。但我不确定您能否找到导致创建临时表的原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多