tempdb
База данных tempdb
— это системная база данных SQL Server, которая служит в качестве временного хранилища для:
📌 Что хранится в tempdb
- Временные таблицы и табличные переменные
- Например:
#MyTempTable
,@MyTableVariable
- Таблицы курсоров
- Временные рабочие объекты
- Промежуточные результаты сортировки, хэширования, операций join и т.д.
- Сохраненные планы выполнения
- Онлайн-операции с индексами
- Снапшоты изоляции (Snapshot Isolation)
- Row Versioning (версионирование строк)
🔁 Особенности tempdb
Характеристика | Описание |
---|---|
Пересоздается при каждом перезапуске SQL Server | При старте SQL Server копирует пустую шаблонную БД model в tempdb . |
Общая для всех пользоватских баз данных | Все пользоваты и процессы используют одну и ту же tempdb . |
Не поддерживает восстановление | Поскольку tempdb всегда пересоздается, повреждение можно исправить просто перезапуском SQL Server. |
Все данные временные | Ничего не сохраняется между перезапусками. |
⚠️ Распространенные проблемы с tempdb
1. Недостаток места (out of space)
- Может привести к ошибкам:
Could not allocate space for object 'X' in database 'tempdb'
- Часто возникает при больших сортировках, операциях хэширования или использовании курсоров.
✅ Решение:
- Увеличьте размер файлов
tempdb
. - Добавьте больше файлов данных (MDF/NDF).
- Выделите отдельный диск или раздел под
tempdb
.
2. Проблемы с контентенцией (latch contention)
- Происходит при высокой нагрузке на распределитель страниц (
PFS
,GAM
,SGAM
). - Ведет к ухудшению производительности.
✅ Решение:
- Создайте несколько файлов данных
tempdb
(обычно 4–8), равных по размеру. - Используйте Trace Flag 1117 и 1118 (в зависимости от версии SQL Server).
3. Фрагментация автогроу (autogrowth)
- Если
tempdb
часто увеличивается автоматически, это может вызвать фрагментацию и задержки.
✅ Решение:
- Настройте предварительный размер файлов так, чтобы автогроу происходил редко.
- Задавайте фиксированное значение autogrowth (например, 512 МБ), а не процент.
🛠 Как проверить текущее состояние tempdb
1. Проверка использования пространства
SELECT
session_id,
user_objects_alloc_page_count * 8 / 1024 AS UserAllocMB,
user_objects_dealloc_page_count * 8 / 1024 AS UserDeallocMB,
internal_objects_alloc_page_count * 8 / 1024 AS InternalAllocMB
FROM sys.dm_db_task_space_usage
WHERE session_id > 50 -- игнорируем системные сессии
ORDER BY UserAllocMB DESC;
2. Статистика файлов tempdb
USE tempdb;
GO
EXEC sp_helpfile;
Или детальная информация о файлах:
SELECT name, size/128.0 AS CurrentSizeMB,
size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS FreeSpaceMB,
growth, is_percent_growth
FROM sys.database_files;
🧼 Как очистить tempdb
Так как
tempdb
пересоздается при перезапуске SQL Server, единственным надежным способом "очистки" является перезагрузка службы.
Альтернативы:
- Перезапустите SQL Server.
- Убедитесь, что все временные объекты удалены явно (DROP TABLE #Temp
).
- Избегайте длительного удержания соединений с временными таблицами.
🧩 Как правильно настроить tempdb
🔹 Количество файлов
Общее число логических процессоров | Рекомендуемое количество файлов tempdb |
---|---|
≤ 8 | 4 |
8–32 | 8 |
> 32 | 16 |
Все файлы должны быть одинакового размера, чтобы обеспечить балансировку нагрузки.
🔹 Автогроу
- Не ставьте слишком маленькие значения (например, 10%).
- Лучше использовать фиксированный размер роста (например, 512 MB).
- Отслеживайте частые автогроу через логи или мониторинг.
📈 Советы по производительности
- Выделяйте отдельный диск для
tempdb
(SSD предпочтительно). - Размещайте файлы
.mdf
и.ldf
на разных дисках. - Отключите параметр автоувеличения файла, если возможно (ручное управление).
- Избегайте чрезмерного использования временных таблиц и курсоров.