create table #temp...; insert into #temp...
或select ... into #temp...
引起的,而是复杂的联接。某些tempdb文件的初始大小每次也会自动设置为更大的值。如何防止呢?
有时缓存的计划会阻止调整大小/缩小文件。如何找到哪个人持有tempdb?
#1 楼
您可以使用三种DMV来跟踪tempdb的使用情况:前两个允许您在查询和会话级别跟踪分配。第三个跟踪版本存储库,用户和内部对象之间的分配。
以下示例查询将为您提供每个会话的分配:
SELECT
sys.dm_exec_sessions.session_id AS [SESSION ID]
,DB_NAME(database_id) AS [DATABASE Name]
,HOST_NAME AS [System Name]
,program_name AS [Program Name]
,login_name AS [USER Name]
,status
,cpu_time AS [CPU TIME (in milisec)]
,total_scheduled_time AS [Total Scheduled TIME (in milisec)]
,total_elapsed_time AS [Elapsed TIME (in milisec)]
,(memory_usage * 8) AS [Memory USAGE (in KB)]
,(user_objects_alloc_page_count * 8) AS [SPACE Allocated FOR USER Objects (in KB)]
,(user_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR USER Objects (in KB)]
,(internal_objects_alloc_page_count * 8) AS [SPACE Allocated FOR Internal Objects (in KB)]
,(internal_objects_dealloc_page_count * 8) AS [SPACE Deallocated FOR Internal Objects (in KB)]
,CASE is_user_process
WHEN 1 THEN 'user session'
WHEN 0 THEN 'system session'
END AS [SESSION Type], row_count AS [ROW COUNT]
FROM
sys.dm_db_session_space_usage
INNER join
sys.dm_exec_sessions
ON sys.dm_db_session_space_usage.session_id = sys.dm_exec_sessions.session_id
如果如果要跟踪一段时间的使用情况,请考虑使用sp_whoisactive收集数据,如Kendra Little所示。
评论
谢谢。 [SPACE为用户对象分配空间(以KB为单位)]和[SPACE为用户对象分配空间(以KB为单位)]是会话的实际占用空间吗?
– u23432534
2012年2月26日在2:22
#2 楼
问题的来源可能很多:表变量或临时表的使用
sql server在tempdb中将中间结果集作为工作表创建-通常用于排序目的(通常是缺少索引的符号/过期的统计信息)
sql server决定预先评估表值函数的结果集,在这种情况下,它将数据存储在tempdb中。 />
#3 楼
我正在使用查询存储,将“度量标准”选择为“已使用的临时数据库内存(KB)”,将统计信息选择为“最大”。
然后我找到了杀死我的TempDB的男孩。已经检查了查询存储功能,该功能不适用于SQL Server2008。
评论
我们启用了查询存储,但是在下拉列表中看不到使用的临时数据库内存。您是如何使它出现在@Tajmahals的?
–山本彰(Akira Yamamoto)
20年6月12日在1:40
@AkiraYamamoto我认为自SQL Server 2016起就可以使用TempDB度量。SQLServer 2014可能没有。
–塔杰马哈尔斯
20年6月16日在8:05
tks,我们正在使用SQL Server 2016 tho
–山本彰(Akira Yamamoto)
20 Jun 17'0:31
评论
抱歉,将近凌晨2点,我没有时间完全回答这个问题,但是当您等待其他答案时,这些URL可能会派上用场-mssqltips.com/sqlservertip/1432/…和google.com/search?q=哪些+查询+正在+使用+ tempdb