虽然我从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它的自我,虽然存储很便宜,但我需要确保包含所有增长的建议(将数据库分成多个文件,可能缩小,将数据库移动到单独的驱动器)我们将不胜感激。
答案 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)分配专用存储
更多详情: