使用变量表,tempdb增长和db会话休眠

时间:2016-07-27 09:48:12

标签: sql tsql tempdb

虽然我从this post得到了一些进一步的见解,但我仍然在努力更全面地了解我最近使用的变量表以及相关的tempdb增长。

我最近在存储过程和表值函数中使用了变量表。我使用变量表v的本地/全局临时表是一个可能影响我遇到的更大挑战的领域。

由于使用这种类型的临时表,tempdb已经增长到大约50 + GB区域,并且当使用exec sp_spaceused @updateusage=true检查表时,我看到:database_size: 51935.13MB unallocated_space: 51908.80MB并且在检查时数据库的内容不存在临时表或系统表。对于ref,tempdb.ldf非常小。

在使用exec sp_who检查我的会话使用情况时,我也看到多行表示睡眠,我怀疑这可能是我们遇到连接未正确关闭的问题。

通过阅读各种帖子,我们普遍的共识是不要试图缩小tempdb和相关文件,事实上我更倾向于解决根本问题,而不是转向更加零散的数据存储。 / p>

对于为什么我现有的方法可能会影响tempdb增长以及是否更适合使用本地/全局临时表,是否有任何建议。

关于tempdb它的自我,虽然存储很便宜,但我需要确保包含所有增长的建议(将数据库分成多个文件,可能缩小,将数据库移动到单独的驱动器)我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以检查tempdb数据库中的对象以了解正在进行的操作

以下代码列出tempdb中的对象,并根据创建日期和计算持续时间以分钟为单位排序asc

use TempDb
go

SELECT 
 name ,object_id , SCHEMA_NAME(schema_id) obj_schema,
 type ,  type_desc,
 create_date ,  modify_date, 
 OBJECT_NAME(parent_object_id)  parent_obj ,
 DATEDIFF(hour,create_date , GETDATE()) duration_hour
FROM sys.objects  
where name  not like 'sys%'
order by create_date

tempDb中的对象分为三组:

  • 内部对象
  • 外部对象
  • 版本商店

以下代码显示了为每个类别分配了多少tempdb磁盘空间

SELECT 
SUM(user_object_reserved_page_count)/128.0 UserObjectsMB,
SUM(user_object_reserved_page_count) UserObjectPages_count  ,

SUM(version_store_reserved_page_count)/128.0 VersionStoreMB,
SUM(version_store_reserved_page_count) VersionStorePages_count, 

SUM(internal_object_reserved_page_count) InternalObjectPages_count, 
SUM(internal_object_reserved_page_count)/128.0 InternalObjectsMB,

SUM(unallocated_extent_page_count)/128.0 FreeSpaceMB,
SUM(unallocated_extent_page_count)  FreePages_count

FROM sys.dm_db_file_space_usage;

你可以查看: local-and-global-temporary-tables-in-sql-server

对于每日和高峰工作负载,tempdb的大小应足够大,以避免在WorkLoad运行时增长。

我的建议是,除非必要,否则不要在启动或任何其他时间缩小tempDb。 存储很便宜,您可以为tempDb(甚至是SSD)分配专用存储

更多详情:

Capacity Planning for tempdb

Optimizing tempdb Performance