SQL

Как уменьшить размер tempdb MS SQL

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

Уменьшать tempdb можно, но делать это стоит только после проверки причины роста. Иначе файл быстро вырастет снова

Что проверить перед уменьшением

Сначала посмотрите файлы tempdb:

USE tempdb;
GO

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

Проверьте, сколько места занято:

SELECT
    SUM(user_object_reserved_page_count) * 8 / 1024 AS user_objects_mb,
    SUM(internal_object_reserved_page_count) * 8 / 1024 AS internal_objects_mb,
    SUM(version_store_reserved_page_count) * 8 / 1024 AS version_store_mb,
    SUM(unallocated_extent_page_count) * 8 / 1024 AS free_space_mb
FROM sys.dm_db_file_space_usage;

Если место занято активными объектами, shrink не поможет или не сможет освободить нужный объем

Как найти активные запросы

Посмотрите активные запросы:

SELECT
    session_id,
    status,
    command,
    wait_type,
    blocking_session_id
FROM sys.dm_exec_requests
WHERE database_id = 2;

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

Уменьшение файла через DBCC SHRINKFILE

Посмотрите логические имена файлов:

USE tempdb;
GO

SELECT name
FROM sys.database_files;

Затем можно уменьшить конкретный файл:

DBCC SHRINKFILE (tempdev, 1024);

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

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

Если причина не устранена, tempdb снова увеличится. Частые причины:

  • тяжелые сортировки
  • большие временные таблицы
  • неудачные запросы
  • версионность строк
  • длинные транзакции
  • построение индексов
  • большие отчеты
  • нехватка памяти для операций

Поэтому shrink — это не лечение, а временное освобождение места

Перезапуск SQL Server

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

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

Как задать нормальный размер заранее

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

Плохая настройка — маленький начальный размер и частый autogrowth. Это создает лишнюю нагрузку

Хорошая настройка — размер, который соответствует реальной нагрузке, плюс контролируемый шаг роста

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

На тестовом сервере выполните:

USE tempdb;
GO

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

Запишите текущие размеры файлов. Затем изучите, какой файл занимает место: data или log. Не выполняйте shrink на рабочем сервере без понимания причины роста

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

  • Уменьшать tempdb, пока тяжелый запрос еще работает
  • Делать shrink каждый день по расписанию
  • Не проверять version store
  • Перезапускать SQL Server без окна обслуживания
  • Задавать слишком маленький начальный размер файлов
  • Думать, что большая tempdb всегда ошибка
  • Путать tempdb с LDF-файлом пользовательской базы

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

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

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

Настройки cookie

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