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/lessons/pg-lab-06-1-tuple-anatomy

lesson ── postgres-labs ── ~22 мин ── 5 шагов

Декодируй заголовок строки и цепочку версий

Собери цепочку версий руками и декодируй заголовки. Перед запросом heap_page_items предсказывай: сколько версий будет на странице, какой ctid у живой, как свяжутся xmax и xmin соседних версий.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Собери цепочку из трёх версий

    Создай таблицу, вставь строку и дважды обнови её. Получится три версии на одной странице. Предскажи их число.

    sql
    CREATE TABLE tup (id int, note text);
    INSERT INTO tup VALUES (1, 'v1');
    UPDATE tup SET note = 'v2' WHERE id = 1;
    UPDATE tup SET note = 'v3' WHERE id = 1;
    SELECT count(*) FROM heap_page_items(get_raw_page('tup', 0));
    подсказка

    Каждый UPDATE добавляет новую версию, старая остаётся на странице.

    ✓ Три версии на странице: одна живая, две устаревшие.

  2. 02

    Живая версия

    SELECT показывает только живую версию. Предскажи её ctid до запроса.

    sql
    SELECT ctid, xmin, xmax, note FROM tup;
    подсказка

    Третья по счёту версия - последняя в цепочке.

    ✓ Живая версия - (0,3), последняя в цепочке.

  3. 03

    У живой версии xmax равен нулю

    Живая версия ещё никем не помечена устаревшей, поэтому её xmax - ноль.

    sql
    SELECT xmax FROM tup;

    ✓ xmax = 0 - версия жива.

  4. 04

    xmax каждой версии равен xmin следующей

    Прочитай все версии и проверь связь: транзакция, закрывшая старую версию, открыла новую, поэтому xmax старой совпадает с xmin новой.

    sql
    SELECT lp, t_xmin, t_xmax, t_ctid
    FROM heap_page_items(get_raw_page('tup', 0)) ORDER BY lp;

    ✓ xmax первой версии равен xmin второй - одна транзакция.

  5. 05

    t_ctid ведёт к следующей версии

    У первой версии t_ctid указывает не на себя, а на вторую версию (0,2). Так образуется цепочка (0,1) → (0,2) → (0,3).

    sql
    SELECT lp, t_ctid FROM heap_page_items(get_raw_page('tup', 0)) ORDER BY lp;

    ✓ t_ctid первой версии ведёт на (0,2) - звено цепочки.

Что ты узнал

UPDATE строит цепочку версий: t_ctid ведёт от старой к новой, xmax каждой равен xmin следующей, живая версия имеет xmax 0 и указывает на себя. SELECT показывает только живую, устаревшие лежат на странице.

команды

  • SELECT ctid, xmin, xmax FROM t;версионные поля живой строки
  • SELECT lp, t_xmin, t_xmax, t_ctid FROM heap_page_items(get_raw_page('t',0));все версии на странице

концепции

  • · t_xmin - кто вставил версию, t_xmax - кто пометил устаревшей
  • · t_ctid ведёт от старой версии к новой - цепочка после UPDATE
  • · xmax старой версии равен xmin новой - это одна транзакция

← предыдущая

Вскрой страницу heap инструментом pageinspect

следующая →

Измерь, как порядок колонок меняет размер строки

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки