To find out how much tempdb disk space is occupied by each session that is connected and is idle in a SQL Server database, you can use the following query. This query leverages Dynamic Management Views (DMVs) like sys.dm_db_session_space_usage and sys.dm_exec_sessions to identify idle sessions and their tempdb usage.
Query to Find tempdb Disk Space Usage by Idle Sessions:
SELECT
es.session_id,
es.login_name,
es.host_name,
es.program_name,
es.status,
su.user_objects_alloc_page_count * 8 / 1024.0 AS user_objects_alloc_mb,
su.user_objects_dealloc_page_count * 8 / 1024.0 AS user_objects_dealloc_mb,
su.internal_objects_alloc_page_count * 8 / 1024.0 AS internal_objects_alloc_mb,
su.internal_objects_dealloc_page_count * 8 / 1024.0 AS internal_objects_dealloc_mb,
(su.user_objects_alloc_page_count - su.user_objects_dealloc_page_count) * 8 / 1024.0 AS user_objects_net_mb,
(su.internal_objects_alloc_page_count - su.internal_objects_dealloc_page_count) * 8 / 1024.0 AS internal_objects_net_mb
FROM
sys.dm_db_session_space_usage su
JOIN
sys.dm_exec_sessions es
ON su.session_id = es.session_id
WHERE
es.status = 'sleeping' -- Filter for idle sessions
AND (su.user_objects_alloc_page_count > 0 OR su.internal_objects_alloc_page_count > 0) -- Filter for sessions using tempdb
ORDER BY
user_objects_net_mb DESC, internal_objects_net_mb DESC;Explanation of the Query:
-
sys.dm_db_session_space_usage:- Tracks tempdb space usage for each session.
- Columns like
user_objects_alloc_page_countandinternal_objects_alloc_page_countshow the number of 8 KB pages allocated for user objects (e.g., temporary tables) and internal objects (e.g., worktables).
-
sys.dm_exec_sessions:- Provides session-level information, such as
session_id,login_name,host_name,program_name, andstatus. - The
statuscolumn is used to filter for idle sessions (status = 'sleeping').
- Provides session-level information, such as
-
Calculations:
- Multiply page counts by
8 / 1024.0to convert pages to megabytes (MB). - Calculate the net space usage by subtracting deallocated pages from allocated pages.
- Multiply page counts by
-
Filters:
-
es.status = 'sleeping': Filters for sessions that are idle (not actively running queries). -
su.user_objects_alloc_page_count > 0 OR su.internal_objects_alloc_page_count > 0: Ensures only sessions using tempdb are included.
-
-
Output:
-
user_objects_net_mb: Net space used by user objects (e.g., temporary tables) in MB. -
internal_objects_net_mb: Net space used by internal objects (e.g., worktables) in MB.
-
Example Output:
| session_id | login_name | host_name | program_name | status | user_objects_alloc_mb | user_objects_dealloc_mb | internal_objects_alloc_mb | internal_objects_dealloc_mb | user_objects_net_mb | internal_objects_net_mb |
|---|---|---|---|---|---|---|---|---|---|---|
| 52 | sa | SQLHost01 | SQLServerManagement | sleeping | 50.25 | 10.00 | 20.50 | 5.00 | 40.25 | 15.50 |
| 67 | app_user | AppServer01 | MyApp.exe | sleeping | 30.00 | 30.00 | 0.00 | 0.00 | 0.00 | 0.00 |
Key Notes:
- Idle sessions (
status = 'sleeping') may still hold tempdb resources if they have not explicitly dropped temporary objects or if their scope has not ended. - If you notice high tempdb usage by idle sessions, investigate whether temporary objects are being properly cleaned up or if long-running transactions are holding resources.
This query is a great way to monitor and troubleshoot tempdb usage, especially in environments with high concurrency or large temporary object usage.