tempdb-Contention (SQL Server)
Symptom
PAGELATCH_UP/EX-Waits, Contention auf den tempdb-Allokationsseiten (PFS/GAM/SGAM), allgemeine Langsamkeit.
1. Die Contention bestätigen
PAGELATCH-Waits auf tempdb-Systemseiten (etwa 2:1:1) deuten auf Allokations-Contention hin.
SQL Server
SELECT session_id, wait_type, wait_duration_ms, resource_description
FROM sys.dm_os_waiting_tasks
WHERE wait_type LIKE 'PAGELATCH%' AND resource_description LIKE '2:%'
ORDER BY wait_duration_ms DESC;2. tempdb-Nutzung aufschlüsseln
Wer nutzt wie viel tempdb? Interne Objekte (Sort-/Hash-Spills), der Version Store oder Benutzerobjekte?
SQL Server
SELECT * FROM sys.dm_db_file_space_usage;
SELECT TOP 10 session_id, user_objects_alloc_page_count, internal_objects_alloc_page_count
FROM sys.dm_db_task_space_usage ORDER BY internal_objects_alloc_page_count DESC;3. Die Dateikonfiguration korrigieren
Verwende für tempdb mehrere GLEICH große Datendateien, entsprechend der Anzahl der CPU-Kerne (bis zu 8). Ab SQL 2016+ wird das bei der Installation empfohlen; in älteren Versionen nutze die Trace Flags 1117/1118. Lege die Dateien auf eine schnelle Platte (lokale NVMe).
4. Die ausufernde Abfrage finden
Abfragen mit großen Sort-/Hash-Spills lassen tempdb explodieren. Nimm diejenigen mit unzureichenden Memory Grants oder schlechten Plänen ins Visier; verringere Spills mit Indizes/Plänen.
SQL Server
SELECT TOP 10 t.text, mg.requested_memory_kb, mg.granted_memory_kb
FROM sys.dm_exec_query_memory_grants mg CROSS APPLY sys.dm_exec_sql_text(mg.sql_handle) t
ORDER BY mg.requested_memory_kb DESC;5. Entsprechungen in anderen Datenbanken
Dieselbe 'Contention um temporären Platz' ist in Oracle der TEMP-Tablespace (v$tempseg_usage / v$sort_usage) und in PostgreSQL temp_files und Überlauf von work_mem. Die eigentliche Lösung ist immer dieselbe: die auslagernde Abfrage korrigieren und den temporären Speicher beschleunigen.