Конкуренция в tempdb (SQL Server)
Симптом
Ожидания PAGELATCH_UP/EX, конкуренция за страницы распределения tempdb (PFS/GAM/SGAM), общее замедление.
1. Подтвердите конкуренцию
Ожидания PAGELATCH на системных страницах tempdb (например, 2:1:1) указывают на конкуренцию за распределение.
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
Кто и сколько использует tempdb? Внутренние объекты (сбросы sort/hash), version store или пользовательские объекты?
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. Исправьте конфигурацию файлов
Используйте для tempdb несколько файлов данных ОДИНАКОВОГО размера, по числу ядер CPU (до 8). SQL 2016+ рекомендует это при установке; в старых версиях используйте флаги трассировки 1117/1118. Разместите файлы на быстром диске (локальный NVMe).
4. Найдите «разбушевавшийся» запрос
Запросы с большими сбросами sort/hash раздувают tempdb. Ищите запросы с недостаточным memory grant или плохими планами; уменьшайте сбросы с помощью индексов/планов.
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. Аналоги в других базах данных
Та же «конкуренция за временное пространство» в Oracle — это табличное пространство TEMP (v$tempseg_usage / v$sort_usage), а в PostgreSQL — temp_files и переполнение work_mem. Коренное решение всегда одно: исправить запрос со сбросами и ускорить временное пространство.