SQL

Tempdb в SQL: как почистить, уменьшить размер и не сломать сервер

tempdb в SQL Server — это системная база для временных таблиц, сортировок, промежуточных операций, версионности строк и служебной работы запросов. Ее нельзя просто удалить или «почистить» как папку на диске. Если tempdb вырос, сначала нужно понять, что его раздувает, а уже потом уменьшать размер

Короткий ответ такой: безопасная чистка tempdb обычно начинается с проверки активных запросов и свободного места, а не с команды shrink. Временное уменьшение файла может помочь освободить диск, но если причина роста осталась, tempdb снова увеличится

Почему tempdb растет

Tempdb растет, когда SQL Server нужны временные ресурсы. Это может быть большой запрос с сортировкой, тяжелый JOIN, создание временных таблиц, индексация, версионность при включенном snapshot isolation или длительная транзакция

Сама по себе большая tempdb не всегда ошибка. Иногда серверу действительно нужно больше места. Проблема начинается, когда диск заканчивается, запросы зависают или tempdb растет из-за неудачного запроса, который никто не остановил

Как посмотреть размер tempdb

Проверьте файлы tempdb и их размер через системные представления

USE tempdb;

SELECT
    name,
    type_desc,
    size * 8 / 1024 AS size_mb
FROM sys.database_files;

Так вы увидите, сколько места занимают файлы данных и лог tempdb. Если размер резко вырос, дальше нужно искать активные сессии и запросы

Как понять, кто использует tempdb

Для первичной диагностики можно посмотреть сессии, которые используют внутренние и пользовательские объекты tempdb

SELECT
    session_id,
    user_objects_alloc_page_count * 8 / 1024 AS user_objects_mb,
    internal_objects_alloc_page_count * 8 / 1024 AS internal_objects_mb
FROM sys.dm_db_session_space_usage
ORDER BY (user_objects_alloc_page_count + internal_objects_alloc_page_count) DESC;

Если одна сессия резко выделяется, нужно понять, что она выполняет. На рабочем сервере не стоит сразу убивать сессию: сначала проверьте, не идет ли важная операция, резервное обслуживание или регламентная задача

Как уменьшить tempdb

Если причина роста уже устранена и нужно освободить место, можно использовать DBCC SHRINKFILE для конкретного файла. Делать это нужно аккуратно и лучше в окно обслуживания

USE tempdb;
DBCC SHRINKFILE (tempdev, 1024);

В примере tempdev — имя файла, а 1024 — целевой размер в мегабайтах. У вас имя файла может отличаться, поэтому сначала посмотрите sys.database_files

Иногда tempdb уменьшается только после перезапуска службы SQL Server, потому что tempdb пересоздается при старте сервера. Но перезапуск выбивает всех пользователей и останавливает приложения, поэтому на рабочем сервере это отдельное административное решение, а не обычная кнопка очистки

Что делать, если tempdb снова растет

Если tempdb снова быстро увеличивается, shrink не решил проблему. Нужно искать запрос, процесс или настройку, которая создает нагрузку. Часто помогают анализ планов запросов, проверка больших сортировок, индексов, временных таблиц, длительных транзакций и задач 1С

Для серверов 1С tempdb может расти на тяжелых отчетах, закрытии месяца, обменах, регламентных операциях и неудачных запросах. В таких случаях механическое уменьшение файла без анализа причины почти всегда дает краткосрочный эффект

Мини-практика

На тестовом сервере выполните проверку размера tempdb, затем посмотрите сессии по использованию места. Не запускайте shrink на рабочей базе без понимания причины

USE tempdb;

SELECT name, size * 8 / 1024 AS size_mb
FROM sys.database_files;

SELECT TOP 10
    session_id,
    user_objects_alloc_page_count * 8 / 1024 AS user_mb,
    internal_objects_alloc_page_count * 8 / 1024 AS internal_mb
FROM sys.dm_db_session_space_usage
ORDER BY user_mb + internal_mb DESC;

Если видите сессию с большим потреблением, дальше нужно смотреть текст запроса и контекст выполнения, а не сразу уменьшать файл

Частые ошибки

Первая ошибка — удалять файлы tempdb вручную с диска. SQL Server управляет этими файлами сам, ручное удаление может привести к аварийной ситуации

Вторая ошибка — делать shrink каждый день по расписанию. Это может ухудшать производительность, потому что файл снова растет, диск фрагментируется, а сервер тратит время на расширение

Третья ошибка — лечить симптом вместо причины. Если tempdb растет из-за тяжелого отчета или плохого запроса, нужно разбираться с запросом, индексами и нагрузкой

Что почитать дальше по SQL

Если нужен общий маршрут по теме, откройте рубрику SQL. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x