ВАКУУМНАЯ ЗАМОРАЖИВАНИЕ против ВАКУУМНОЙ ПОЛНОЙ

18

Может кто-нибудь объяснить разницу между этими типами VACUUMв PostgreSQL?

Я прочитал документ, но он просто говорит, что FULLблокирует таблицы и FREEZE«замораживает» кортежи. Я думаю, что это то же самое. Я ошибаюсь?

Кристиан Маиз
источник
Вы читали документ? Это было бы прекрасной возможностью включить ссылку на то, что вы прочитали ...
Эрвин Брандштеттер

Ответы:

12

Вот краткий краткий ответ.

Вакуумное заполнение снимает эксклюзивную блокировку и перестраивает таблицу так, чтобы в ней не было пустых блоков (пока мы представим, что коэффициент заполнения равен 100%).

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

Например, база данных template0 заморожена, потому что она никогда не изменяется (по умолчанию вы не можете подключиться к ней.)

Время от времени демон autovacuum будет проверять базу данных и ее таблицы, чтобы увидеть, что нужно пылесосить. Если таблица вакуумно замораживается, а затем никогда не обновляется, демон autovacuum просто пропустит ее. Кроме того, защита «обтекания» в postgresql также никогда не сработает на этом столе.

tl; dr freezing отмечает таблицу как не нуждающуюся в техническом обслуживании. Следующее обновление разморозит его.

Скотт Марлоу
источник
Итак, VACUUM FREEZEтребует ли эксклюзивная блокировка на столе? Похоже, так и должно быть, иначе вы рискуете внезапно сделать строки из активных транзакций глобально видимыми. Я мог бы неправильно это понять ...
Парфянский выстрел
Никакой вакуумной заморозки нет, вакуумной полной.
Скотт Марлоу
6

Для дальнейшего объяснения того, что написал Джаядеван.

Postgres работает с транзакциями и отслеживает видимые данные, сравнивая внутренние идентификаторы транзакций. Однако, поскольку эти транзакции представляют собой 32-разрядное целое число, рано или поздно они будут перенесены, и поэтому новая транзакция будет выглядеть так, как будто она была сделана в прошлом (и, таким образом, будет видна в текущей транзакции, а не должна), в то время как старые транзакции будут выглядеть так, как будто они выполняются в будущем (и поскольку будущее еще не существует, эти данные больше не будут видны).

Чтобы противостоять этой проблеме, Postgres назначает каждой строке, достаточно старой, чтобы подвергаться риску такого переноса, специальный идентификатор транзакции, который всегда старше каждой транзакции. Вы можете видеть, как если бы действительные идентификаторы транзакций варьировались от 0 до 2147483647, он установит идентификатор транзакции для всех текущих строк в -1.

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

Что VACUUM FREEZEв основном заключается в замораживании идентификатора транзакции для всех страниц, независимо от того, были ли они изменены или нет, так что все текущие строки будут считаться старыми для всех новых транзакций.

Однако, начиная с версии 8.2 VACUUM FREEZE, она устарела и не должна использоваться. Вместо этого есть параметры vacuum_freeze_table_ageи autovacuum_freeze_max_ageчто определяет , сколько транзакций может произойти до того, как полное сканирование делается на столе (фактически сделать внутренний VACUUM FREEZEна столе).

Джимми Стенке
источник
3
Как это, что документы не упоминают об VACUUM FREEZEустаревшем / обескураженном?
Дезсо
Интересный. Это было сделано для версий между 8.2 и 9.0. Возможно, они сняли амортизацию, потому что это может быть хорошей особенностью.
Джимми Стенке
1

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

полный вакуум уплотняет отношение, возвращающее все пустое пространство. Это требует эксклюзивной блокировки и плохо для производственных систем в целом из-за этого.

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

Итак, поскольку обычный вакуум не предназначен для восстановления всего, вы не должны удивляться тому, что на самом деле он не восстанавливал все. Попробуйте эксперимент с большими наборами данных с большим количеством случайных удалений и т. Д., Чтобы увидеть разницу между обычным и полным вакуумом ».

http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html

Чтобы добавить к этому, полный вакуум фактически создаст новые файлы для таблицы (существующие файлы уменьшились бы до 0 размера). Таким образом ОС может вернуть себе пространство.

Jayadevan
источник
2
Вопрос просит VACUUM FREEZEв частности.
Эрвин Брандштеттер
Правда - «разница между этими типами вакуума в PostgreSQL» - я думал, что вопрос был о различиях между типами вакуума.
Джаядеван