Место, необходимое для таблицы VACUUM FULL

Из руководства PostgreSQL 10.4 о полном вакууме:

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

Я читал об этом во многих разных местах и ​​формулировал по-разному. Некоторые указывают, что требуемое пространство в лучшем случае равно размеру очищаемой таблицы. Намек на то, что может потребоваться достаточно места только для хранения результирующей очищенной таблицы, т. е. размером в диапазоне [0-size_of_original_table], в зависимости от того, сколько мертвых строк находится в таблице.

Мой вопрос: всегда ли для полной очистки таблицы требуется пространство, равное исходному размеру таблицы, или это зависит от количества живых строк в таблице?


person Thrasi    schedule 16.07.2018    source источник


Ответы (2)


Дополнительное пространство, необходимое для VACUUM (FULL), зависит от количества действующих строк в таблице.

Во время VACUUM (FULL) происходит запись новой копии таблицы. Все живые кортежи (= версии строк) и мертвые кортежи, которые еще нельзя удалить, будут записаны в эту новую копию.

Когда транзакция завершится, старая копия будет удалена.

person Laurenz Albe    schedule 16.07.2018
comment
спасибо за исправление. Таким образом, для таблицы размером 1 ГБ с 500 МБ активных строк и 500 МБ мертвых строк VACCUM FULL в таблице будет постепенно выделять пространство при копировании активных строк в новую таблицу до тех пор, пока не будет достигнуто 500 МБ? В отличие от выделения 1 ГБ, копирования активных строк и последующего возврата избыточного выделенного пространства, в данном случае 500 МБ. - person Thrasi; 16.07.2018
comment
не удалось отметить вас выше - person Thrasi; 16.07.2018
comment
Очень полезный ответ, вы можете проверить, сколько кортежей мертво, запросив pg_stat_user_tables (или pg_stat_sys_tables в случае TOAST dba.stackexchange.com /a/223225/94649 ). - person odinho - Velmont; 23.07.2020
comment
@Thrasi Ты правильно понял. Используемое дисковое пространство не выделяется заранее, а увеличивается по мере записи нового файла. - person Laurenz Albe; 10.08.2020

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

т. е. если размер вашей базы данных составляет 10 ГБ, а размер самой большой таблицы в вашей базе данных составляет 2 ГБ. Тогда у вас должно быть не менее 2 ГБ свободного места на диске, чтобы успешно завершить очистку.

Поскольку VACUUM FULL создаст новую копию таблицы, исключив мертвые строки, а затем удалит существующие таблицы.

person Vipul Shukla    schedule 27.07.2018
comment
Рекомендуется, потому что если самая большая таблица содержит только живые строки, вам нужно столько места. Но если вы знаете, что ваш самый большой содержит в основном мертвые строки, вам может сойти с рук меньше, вот что я понял из этого. - person Thrasi; 01.08.2018
comment
Да, возможно. Если вы знаете, сколько активных данных присутствует в этой таблице, то свободного места должно быть больше. Но если размер активных данных в этой таблице меньше, чем данных в других таблицах, то вам также придется подумать о требуемом для нее пространстве. - person Vipul Shukla; 15.08.2018