tempdb 경합과 공간 사용 진단
SQL Server성능명령어
-- 1) Current tempdb page latch waits (2:1:1 PFS, 2:1:2 GAM, 2:1:3 SGAM):
SELECT wt.session_id, wt.wait_type, wt.wait_duration_ms, wt.resource_description
FROM sys.dm_os_waiting_tasks wt
WHERE wt.wait_type LIKE N'PAGELATCH[_]%'
AND wt.resource_description LIKE N'2:%';
-- 2) Sessions using the most tempdb (MB):
SELECT TOP (20) su.session_id, s.login_name, s.program_name,
(su.user_objects_alloc_page_count - su.user_objects_dealloc_page_count) * 8 / 1024 AS user_obj_mb,
(su.internal_objects_alloc_page_count - su.internal_objects_dealloc_page_count) * 8 / 1024 AS internal_obj_mb
FROM sys.dm_db_session_space_usage su
JOIN sys.dm_exec_sessions s ON s.session_id = su.session_id
WHERE s.is_user_process = 1
ORDER BY su.user_objects_alloc_page_count + su.internal_objects_alloc_page_count
- su.user_objects_dealloc_page_count - su.internal_objects_dealloc_page_count DESC;
-- 3) Overall breakdown and version store:
SELECT SUM(unallocated_extent_page_count) * 8 / 1024 AS free_mb,
SUM(user_object_reserved_page_count) * 8 / 1024 AS user_obj_mb,
SUM(internal_object_reserved_page_count) * 8 / 1024 AS internal_obj_mb,
SUM(version_store_reserved_page_count) * 8 / 1024 AS version_store_mb
FROM tempdb.sys.dm_db_file_space_usage;
SELECT DB_NAME(database_id) AS db, reserved_page_count * 8 / 1024 AS version_store_mb
FROM sys.dm_tran_version_store_space_usage
ORDER BY reserved_page_count DESC;
-- 4) File count / equal sizing and memory-optimized metadata:
SELECT name, type_desc, size * 8 / 1024 AS size_mb, growth * 8 / 1024 AS growth_mb, is_percent_growth
FROM tempdb.sys.database_files;
SELECT SERVERPROPERTY('IsTempdbMetadataMemoryOptimized') AS tempdb_metadata_memopt;하는 일
tempdb 할당 페이지(PFS/GAM/SGAM)와 시스템 테이블의 PAGELATCH 대기, tempdb를 가장 많이 쓰는 세션(임시 테이블 대 sort/hash spill), version store를 키우는 데이터베이스, 파일 구성을 보여 준다.
사용 시점
임시 테이블 워크로드가 많아 PAGELATCH_UP/EX 대기가 증가할 때, tempdb가 가득 찰 때(1105/9002), 또는 version store가 커질 때.
주의
페이지 2:1:1, 2:1:2, 2:1:3 및 8088의 배수인 PFS 페이지는 할당 경합을 의미한다. 해결책은 크기와 증가 단위가 같은 여러 데이터 파일이다(8개까지 코어당 하나, 이후 4개씩 추가). 시스템 테이블 페이지 경합에는 2019+의 memory-optimized tempdb metadata를 사용한다(재시작 필요). version store가 커지면 가장 오래된 열린 스냅샷 트랜잭션을 찾는다. tempdb 축소는 해결책이 아니다. 읽기 전용 쿼리이며 안전함.