Почему удаление строк не сразу освобождает место в PostgreSQL

Записи удалили, а файл базы почти не уменьшился. Объясняем разницу между свободным местом внутри таблицы и местом на диске, а также роль фоновой очистки.

Графитовый лоток с оранжевыми разделителями, свободными ячейками и вынутой стопкой карточек.

Записей стало меньше, размер почти прежний

Представим условный журнал заказов: из него убрали старые записи, которые больше не нужны для текущей работы. Отчёт показывает меньше строк, но занятый базой объём на сервере почти не изменился. На первый взгляд кажется, что удаление не сработало. Однако количество доступных записей и размер файла отвечают на разные вопросы.

Чтобы разобраться, нужно различать три вещи: видит ли приложение удалённую запись, осталось ли внутри таблицы место для повторного использования и вернулось ли это место операционной системе. Одна операция не обязана одновременно приводить все три показателя к ожидаемому значению. Ниже речь именно о PostgreSQL, а не обо всех базах данных сразу.

Зачем базе нужны прежние версии

Несколько пользователей могут одновременно читать и менять сведения. PostgreSQL использует многоверсионность: чтение получает согласованную картину данных, а изменения не должны внезапно разрушать уже выполняющуюся работу. Это назначение механизма объясняет введение в управление параллельным доступом.

Поэтому удаление не означает немедленного физического исчезновения старой версии строки. Она ещё может понадобиться другой незавершённой работе. Когда такая необходимость исчезает, старую версию можно убрать. Для понимания ситуации полезно сначала вспомнить, что такое транзакция: это связанная работа с данными, для которой важны правила видимости изменений.

Очистка готовит место для повторного использования

В документации PostgreSQL по обслуживанию описана регулярная очистка ненужных версий. Освободившееся пространство обычно остаётся внутри таблицы и подходит для будущих записей. Из этого не следует, что файл обязательно уменьшится. В отдельных условиях полностью свободный конец таблицы может быть возвращён системе.

Удобная бытовая аналогия — шкаф с папками. Вы вынули ненужные листы, и на полках появились свободные участки. Новые папки можно поставить туда же. Сам шкаф при этом не стал уже и не освободил площадь комнаты. Аналогия объясняет разницу между повторным использованием и уменьшением внешнего размера, но не описывает устройство файлов буквально.

Условный пример без обещания точного размера

Допустим, в учебной таблице было сто тысяч однотипных записей, а тридцать тысяч удалили. Осталось семьдесят тысяч доступных записей. Нельзя заключить, что размер файла тоже уменьшится ровно на тридцать процентов: расположение строк, индексы и служебные сведения устроены сложнее простого счётчика.

Если затем приходят новые записи, часть подготовленного пространства может использоваться снова. Поэтому наблюдать стоит не только разовый размер после удаления, но и дальнейшую динамику. Неизменный объём в сочетании с возможностью размещать новые сведения может означать совсем другую ситуацию, чем непрерывный рост при той же рабочей нагрузке.

Почему уплотнение обсуждают отдельно

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

Практический вопрос к администратору звучит так: нужно вернуть место серверу прямо сейчас или достаточно повторно использовать его внутри базы? Если таблица скоро вырастет вновь, ответ может отличаться от случая окончательного сокращения большого архива. Решение принимают с учётом доступности приложения и ресурсов, а не только желания увидеть меньшую цифру.

Что выяснить перед выводом о проблеме

Предлагаемый порядок проверки: уточнить, какая таблица изменилась, завершены ли связанные операции, работает ли фоновое обслуживание и что именно измеряется. Иногда обсуждают размер всей базы, хотя удаляли строки только из одной её части. Отдельно существуют индексы — о назначении такого указателя рассказано в материале об индексах.

Название «очистка» не означает восстановление удалённых записей или изменение правил хранения документов. Здесь рассматривается техническое повторное использование пространства. Для начала изучения работы с таблицами и проверки результатов подойдёт программа SQL инженер. Полезная учебная задача — объяснить разницу между числом строк, занятым файлом и доступным для новых записей местом.

SQL инженер
Курс
Доступ сразу
SQL инженер

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

С нуля до junior
Теория и практика
Диплом по окончании
500
₽/мес
УЗНАТЬ ПОДРОБНЕЕ

Источники

Читайте также

Обучить команду или нанять специалиста по данным: как выбрать
47

Обучить команду или нанять специалиста по данным: как выбрать

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

Вертикальное и горизонтальное масштабирование данных: в чём разница

Когда системе добавляют мощность одного сервера, когда делят работу между несколькими и почему увеличение ресурсов само по себе не решает любую проблему.
Журнал изменений данных: как выяснить, кто и когда изменил набор
42

Журнал изменений данных: как выяснить, кто и когда изменил набор

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

Занятия проходят
в Нова Дата СДО

Вебинары, практика и общение с преподавателем — в одном окне браузера.

Посмотреть интерфейс платформы
Календарь обучения в Нова Дата СДО
Курсы студента в Нова Дата СДО
Редактор кода для практики в Нова Дата СДО
Вебинары и расписание Ваши курсы Код в браузере
Нова Дата СДО — в реестре российского ПОРеестровая запись № 34931
Заявка отправлена
Отправим вам подборку курсов в течение 5 минут. С вами также свяжется наш специалист и даст карьерную консультацию.
Персональный промокод
На курс «Инженер по парсингу данных»
Введите код при оплате, чтобы применить скидку к программе.