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/hot-updates

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

HOT-обновления и fillfactor

HOT (Heap-Only Tuple) - обновление, которое не пишет в индексы: оно возможно, если ни одна индексируемая колонка не изменилась и новая версия помещается в ту же страницу. fillfactor оставляет в странице резерв, чтобы обновления оставались HOT.

view as markdownaka: hot, heap-only-tuple, fillfactor

Идея

Обычный UPDATE создаёт новую версию строки с новым ctid, и каждый индекс таблицы должен получить запись на этот ctid. Для таблицы с несколькими индексами это дорого, даже если менялось одно неиндексируемое поле.

HOT-обновление обходит это: если индексируемые колонки не тронуты, старые индексные записи всё ещё ведут «в эту строку», и переписывать их не нужно. Новая версия живёт в той же странице, образуя HOT-цепочку, а индекс находит актуальную версию, пройдя по цепочке от корня.

Два условия

HOT срабатывает, когда выполнены оба:

  1. ни одна колонка из любого индекса таблицы не изменилась;
  2. новая версия помещается в ту же страницу, что и старая.

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

Счётчики

sql
SELECT relname, n_tup_upd, n_tup_hot_upd, n_tup_newpage_upd
FROM pg_stat_all_tables WHERE relname = 'acc';
  • n_tup_hot_upd - обновления, оставшиеся HOT (индексы не тронуты);
  • n_tup_newpage_upd (PG16+) - обновления, ушедшие в новую страницу из-за нехватки места;
  • доля n_tup_hot_upd / n_tup_upd - тот самый hot_update_ratio, который хочется держать высоким на часто обновляемых таблицах.

fillfactor

По умолчанию fillfactor = 100: страница забивается полностью, резерва под новые версии нет, и почти любой UPDATE выталкивает версию в другую страницу. Снижение fillfactor оставляет в странице свободное место:

sql
ALTER TABLE acc SET (fillfactor = 75);

Значения 75-90 типичны для горячих таблиц. Важно: настройка действует только на страницы, заполняемые после изменения; уже плотные страницы остаются такими, пока их не перепишут (VACUUM FULL, CLUSTER).

Цена индекса на горячую колонку

Как только колонка попадает в индекс, любой её UPDATE перестаёт быть HOT - и все индексы таблицы получают новую запись. Поэтому лишний индекс на часто меняющуюся колонку дорог не только местом, но и потерей HOT. Подчищает HOT-цепочки heap-pruning.

§ команды

bash
ALTER TABLE acc SET (fillfactor = 75);

Оставить 25% страницы под будущие HOT-версии

bash
SELECT n_tup_hot_upd, n_tup_newpage_upd FROM pg_stat_all_tables WHERE relname='acc';

Сколько обновлений остались HOT, а сколько ушли в новую страницу

§ см. также

  • heap-pruningВнутристраничная очистка (prune)Prune - лёгкая уборка одной страницы: убирает мёртвые версии внутри неё, не трогая индексы. Запускается оппортунистически при чтении или записи страницы. Корень HOT-цепочки не удаляет, а превращает в redirect-указатель.
  • vacuumVACUUM и removable cutoffVACUUM удаляет мёртвые версии из таблицы и индексов, обновляет Free Space Map и Visibility Map, продвигает горизонт заморозки. Удаляет только версии старше removable cutoff. Обычный VACUUM не уменьшает файл - это делает VACUUM FULL под эксклюзивной блокировкой.
  • autovacuumAutovacuum: пороги и bloatAutovacuum чистит таблицу, когда мёртвых версий накопится больше порога threshold + scale_factor × reltuples (50 и 0.2 по умолчанию). scale_factor 0.2 плохо масштабируется на большие таблицы, поэтому горячим задают индивидуальные пороги. autovacuum=off ведёт к bloat и wraparound.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки