Вопрос старый, но поскольку оба ответа неверны или вводят в заблуждение, я добавлю еще один.
При обновлении строки Postgres записывает новую версию строки, а старая в конечном итоге удаляется VACUUM
после того, как ни одна из запущенных транзакций больше не сможет ее увидеть.
Обычный VACUUM
не возвращает дисковое пространство из физического файла, содержащего таблицу, в систему, если он не находит полностью мертвые или пустые блоки в физическом конце таблицы. Вам нужно запустить VACUUM FULL
или CLUSTER
, чтобы агрессивно сжать стол и вернуть избыточное пространство в систему. Это обычно нежелательно при нормальной работе. Postgres может повторно использовать мертвые кортежи для сохранения новых версий строк на той же странице данных, что повышает производительность.
В вашем случае , поскольку вы обновляете каждую строку, размер таблицы удваивается (по сравнению с ее минимальным размером). Желательно запустить VACUUM FULL
или CLUSTER
, чтобы вернуть наворот в систему.
Оба берут эксклюзивный замок на столе. Если это мешает одновременному доступу, рассмотрите pg_repack
, который может делать то же самое без исключительных блокировок.
Чтобы уточнить: Запуск CLUSTER
полностью освобождает место. Нет VACUUM FULL
необходимо после CLUSTER
(и наоборот).
Подробнее: