Может кто-нибудь объяснить разницу между этими типами VACUUM
в PostgreSQL?
Я прочитал документ, но он просто говорит, что FULL
блокирует таблицы и FREEZE
«замораживает» кортежи. Я думаю, что это то же самое. Я ошибаюсь?
Может кто-нибудь объяснить разницу между этими типами VACUUM
в PostgreSQL?
Я прочитал документ, но он просто говорит, что FULL
блокирует таблицы и FREEZE
«замораживает» кортежи. Я думаю, что это то же самое. Я ошибаюсь?
Ответы:
Вот краткий краткий ответ.
Вакуумное заполнение снимает эксклюзивную блокировку и перестраивает таблицу так, чтобы в ней не было пустых блоков (пока мы представим, что коэффициент заполнения равен 100%).
Вакуумное замораживание помечает содержимое таблицы особой временной меткой транзакции, которая сообщает postgres, что ее не нужно пылесосить никогда. Следующее обновление этого замороженного идентификатора исчезнет.
Например, база данных template0 заморожена, потому что она никогда не изменяется (по умолчанию вы не можете подключиться к ней.)
Время от времени демон autovacuum будет проверять базу данных и ее таблицы, чтобы увидеть, что нужно пылесосить. Если таблица вакуумно замораживается, а затем никогда не обновляется, демон autovacuum просто пропустит ее. Кроме того, защита «обтекания» в postgresql также никогда не сработает на этом столе.
tl; dr freezing отмечает таблицу как не нуждающуюся в техническом обслуживании. Следующее обновление разморозит его.
VACUUM FREEZE
требует ли эксклюзивная блокировка на столе? Похоже, так и должно быть, иначе вы рискуете внезапно сделать строки из активных транзакций глобально видимыми. Я мог бы неправильно это понять ...
Для дальнейшего объяснения того, что написал Джаядеван.
Postgres работает с транзакциями и отслеживает видимые данные, сравнивая внутренние идентификаторы транзакций. Однако, поскольку эти транзакции представляют собой 32-разрядное целое число, рано или поздно они будут перенесены, и поэтому новая транзакция будет выглядеть так, как будто она была сделана в прошлом (и, таким образом, будет видна в текущей транзакции, а не должна), в то время как старые транзакции будут выглядеть так, как будто они выполняются в будущем (и поскольку будущее еще не существует, эти данные больше не будут видны).
Чтобы противостоять этой проблеме, Postgres назначает каждой строке, достаточно старой, чтобы подвергаться риску такого переноса, специальный идентификатор транзакции, который всегда старше каждой транзакции. Вы можете видеть, как если бы действительные идентификаторы транзакций варьировались от 0 до 2147483647, он установит идентификатор транзакции для всех текущих строк в -1.
Однако, поскольку вакуум в основном предназначен для разметки пустого пространства для повторного использования, он работает только на страницах данных, которые были изменены.
Что VACUUM FREEZE
в основном заключается в замораживании идентификатора транзакции для всех страниц, независимо от того, были ли они изменены или нет, так что все текущие строки будут считаться старыми для всех новых транзакций.
Однако, начиная с версии 8.2 VACUUM FREEZE
, она устарела и не должна использоваться. Вместо этого есть параметры vacuum_freeze_table_age
и autovacuum_freeze_max_age
что определяет , сколько транзакций может произойти до того, как полное сканирование делается на столе (фактически сделать внутренний VACUUM FREEZE
на столе).
VACUUM FREEZE
устаревшем / обескураженном?
Скопируйте / вставьте из ответа, когда я задал тот же вопрос: «Обычный вакуум отмечает пустое пространство для повторного использования и возвращает пустое пространство в конце отношения. Поэтому, если пустое пространство находится в середине и т. Д., Это не может быть исправлено только что повторно.
полный вакуум уплотняет отношение, возвращающее все пустое пространство. Это требует эксклюзивной блокировки и плохо для производственных систем в целом из-за этого.
Таким образом, цель вакуума REGULAR состоит не в том, чтобы освободить пространство из таблиц, а сделать его доступным для повторного использования позже. Цель вакуума FULL состоит в том, чтобы освободить все потраченное впустую пространство за счет исключительной блокировки и производительности дб, пока это происходит.
Итак, поскольку обычный вакуум не предназначен для восстановления всего, вы не должны удивляться тому, что на самом деле он не восстанавливал все. Попробуйте эксперимент с большими наборами данных с большим количеством случайных удалений и т. Д., Чтобы увидеть разницу между обычным и полным вакуумом ».
http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html
Чтобы добавить к этому, полный вакуум фактически создаст новые файлы для таблицы (существующие файлы уменьшились бы до 0 размера). Таким образом ОС может вернуть себе пространство.
VACUUM FREEZE
в частности.