linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/kb/Vacuum, freeze, wraparound/heap-pruning

kb/vacuum ── Vacuum, freeze, wraparound ── intermediate

Внутристраничная очистка (prune)

Prune - лёгкая уборка одной страницы: убирает мёртвые версии внутри неё, не трогая индексы. Запускается оппортунистически при чтении или записи страницы. Корень HOT-цепочки не удаляет, а превращает в redirect-указатель.

view as markdownaka: page-pruning, heap-prune, opportunistic-pruning

Зачем нужна, если есть VACUUM

VACUUM проходит таблицу целиком и чистит индексы - это дорого и нечасто. Но страница с длинной HOT-цепочкой переполняется задолго до следующего VACUUM. Внутристраничная очистка (prune) решает локальную задачу: убрать мёртвые версии в пределах одной страницы прямо сейчас, чтобы освободить место под новые версии.

Prune запускается оппортунистически - когда страницу и так читают или пишут, а PostgreSQL видит, что она забита мёртвыми версиями. Отдельного процесса для prune нет: он встроен в обычные обращения к странице.

Что он делает и чего не делает

  • убирает версии, не видимые ни одному снимку, освобождая место в странице;
  • укорачивает HOT-цепочки, перестраивая line pointers;
  • не трогает индексы - это его принципиальное ограничение.

Поскольку prune не может вычистить индексные ссылки, он не удаляет указатель, на который может ссылаться индекс. Вместо этого корень HOT-цепочки превращается в redirect.

lp_flags: статусы указателя

Состояние line pointer видно через pageinspect:

lp_flagsимязначение
0LP_UNUSEDуказатель свободен, переиспользуем
1LP_NORMALведёт к обычной версии строки
2LP_REDIRECTперенаправляет на другой указатель (след HOT)
3LP_DEADмёртвый, ждёт очистки индексов через VACUUM
sql
SELECT lp, lp_flags, t_ctid
FROM heap_page_items(get_raw_page('acc', 0));

LP_REDIRECT - это и есть результат prune: корень цепочки сохранён как точка входа для индекса, но перенаправляет на актуальную версию. LP_DEAD - указатель, который prune пометил мёртвым, но окончательно освободит только VACUUM, предварительно убрав ссылки из индексов.

Связь с HOT

Prune и HOT - две стороны одного механизма. HOT-обновления складывают версии в цепочку внутри страницы (см. hot-updates), а prune эту цепочку подчищает, не давая ей переполнить страницу. Вместе они откладывают необходимость полноценного vacuum, но не отменяют его.

§ команды

bash
CREATE EXTENSION IF NOT EXISTS pageinspect;

Линза для чтения сырых страниц

bash
SELECT lp, lp_flags, t_ctid FROM heap_page_items(get_raw_page('t', 0));

Показать указатели страницы 0 с их статусами

§ см. также

  • hot-updatesHOT-обновления и fillfactorHOT (Heap-Only Tuple) - обновление, которое не пишет в индексы: оно возможно, если ни одна индексируемая колонка не изменилась и новая версия помещается в ту же страницу. fillfactor оставляет в странице резерв, чтобы обновления оставались HOT.
  • vacuumVACUUM и removable cutoffVACUUM удаляет мёртвые версии из таблицы и индексов, обновляет Free Space Map и Visibility Map, продвигает горизонт заморозки. Удаляет только версии старше removable cutoff. Обычный VACUUM не уменьшает файл - это делает VACUUM FULL под эксклюзивной блокировкой.
  • transaction-horizonГоризонт транзакцииГоризонт - минимум backend_xmin по всем активным транзакциям. Версию строки можно убрать, только если она стала мёртвой раньше горизонта. Одна долгая или idle-in-transaction транзакция отодвигает горизонт назад и запрещает уборку мусора во всей базе.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки