DBAtlas · Атлас эксплуатации баз данных

Конкуренция в 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. Коренное решение всегда одно: исправить запрос со сбросами и ускорить временное пространство.

Открыть в DBAtlas →