Найти в Дзене
Postgres DBA

После VACUUM FULL нужно выполнять VACUUM

После VACUUM FULL выполните: VACUUM your_table_name; Это обновит карту видимости, установит флаги ALL_VISIBLE и ALL_FROZEN на страницах, где это возможно, и восстановит оптимальную производительность индексных сканирований. ℹ️Используйте pg_visibility для проверки состояния карты видимости: В большинстве случаев VACUUM FULL не рекомендуется — используйте обычный VACUUM или CLUSTER, если требуется перестроение таблицы. Источник: [PostgreSQL 18: Routine Vacuuming — Visibility Map]
Оглавление

После выполнения VACUUM FULL необходимо выполнить обычный VACUUM для обновления карты видимости (visibility map, VM), поскольку VACUUM FULL не обновляет флаги ALL_VISIBLE и ALL_FROZEN в карте видимости, несмотря на то, что он перезаписывает таблицу и замораживает кортежи.

Обоснование:

  • ‼️VACUUM FULL перезаписывает таблицу в новый файл, удаляя мёртвые кортежи и замораживая оставшиеся. Однако ‼️он не устанавливает флаги видимости в VM‼️, потому что не может гарантировать, что все кортежи на странице видимы для всех транзакций (например, из-за параллельных операций или не завершённых транзакций).
  • ➡️Карта видимости (VM) используется для оптимизации ⚠️index-only scans⚠️ и снижения нагрузки при последующих операциях VACUUM. Если флаг ALL_VISIBLE не установлен, PostgreSQL не может пропускать проверку видимости кортежей при сканировании индекса, что снижает производительность.
  • ➡️Флаги pg_class.relallvisible и pg_class.relfrozenxid также не обновляются после VACUUM FULL, что ⚠️влияет на планировщик запросов⚠️ и управление wraparound-защитой.

Рекомендация:

После VACUUM FULL выполните:

VACUUM your_table_name;

Это обновит карту видимости, установит флаги ALL_VISIBLE и ALL_FROZEN на страницах, где это возможно, и восстановит оптимальную производительность индексных сканирований.

Дополнительно:

ℹ️Используйте pg_visibility для проверки состояния карты видимости:

  • SELECT * FROM pg_visibility_map('your_table_name');

В большинстве случаев VACUUM FULL не рекомендуется — используйте обычный VACUUM или CLUSTER, если требуется перестроение таблицы.

Источник: [PostgreSQL 18: Routine Vacuuming — Visibility Map]