Skip to content

tempdb

База данных tempdb — это системная база данных SQL Server, которая служит в качестве временного хранилища для:


📌 Что хранится в tempdb

  1. Временные таблицы и табличные переменные
  2. Например: #MyTempTable, @MyTableVariable
  3. Таблицы курсоров
  4. Временные рабочие объекты
  5. Промежуточные результаты сортировки, хэширования, операций join и т.д.
  6. Сохраненные планы выполнения
  7. Онлайн-операции с индексами
  8. Снапшоты изоляции (Snapshot Isolation)
  9. 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 на разных дисках.
  • Отключите параметр автоувеличения файла, если возможно (ручное управление).
  • Избегайте чрезмерного использования временных таблиц и курсоров.