Sobes.tech
Назад к вопросам
Middle+
3

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

Компании, где спрашивали
луция

Ответ от нейросети

sobes.tech AI

В PostgreSQL после выполнения команд DELETE или TRUNCATE место на диске не освобождается сразу из-за особенностей механизма управления хранением данных — MVCC (многоверсионный контроль параллелизма).

Основные причины:

  • MVCC и видимость строк: DELETE не удаляет физически строки, а помечает их как удалённые (dead tuples). Они остаются в таблице до тех пор, пока не будет выполнена очистка (VACUUM).

  • VACUUM и освобождение пространства: Команда VACUUM освобождает место, помечая удалённые строки как доступные для повторного использования. Только после этого место становится доступным для новых данных.

  • TRUNCATE: обычно освобождает место быстрее, так как удаляет все данные из таблицы, но в некоторых случаях (например, при наличии зависимостей или транзакций) освобождение может быть отложено.

  • Фрагментация и файлы: PostgreSQL не уменьшает размер файлов таблиц автоматически после удаления данных. Для физического уменьшения размера нужно использовать команду VACUUM FULL или CLUSTER, которые переписывают таблицу и освобождают место на диске.

Таким образом, чтобы действительно освободить место на диске, после удаления данных нужно выполнить VACUUM или VACUUM FULL.