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/Хранение и формат на диске

kb/storage

Хранение в PostgreSQL: страница, кортеж, форки, TOAST

Как PostgreSQL раскладывает данные на диске: кластер, форки отношения, страница 8 КБ, line pointers, заголовок кортежа и вынос длинных значений в TOAST. Фундамент, на котором держатся MVCC, vacuum и индексы.

  • free-space-mapFree Space Map (карта свободного места)

    Карта свободного места (_fsm) хранит для каждой страницы таблицы, сколько в ней свободно места, с точностью до 32 байт. По ней вставка быстро находит страницу с достаточным зазором, не сканируя таблицу. Карту обновляет VACUUM; у крошечных таблиц её может не быть вовсе.

  • line-pointersLine pointers и lp_flags

    Указатель строки (line pointer) - это 4 байта в начале страницы: смещение до кортежа, его длина и флаг состояния. Флаг lp_flags бывает четырёх видов: unused, normal, redirect, dead. Внешний адрес строки (ctid) - это номер указателя, а не позиция в байтах, поэтому строка может двигаться внутри страницы, не меняя адреса.

  • relfilenode-forksrelfilenode и форки отношения

    Каждая таблица и индекс лежит на диске как набор файлов - форков. Главный форк хранит сами данные, _fsm - карту свободного места, _vm - карту видимости, _init - шаблон для нежурналируемых таблиц. Имя файла - это relfilenode, и оно не равно OID после перезаписи таблицы.

  • toastTOAST: вынос и сжатие длинных значений

    Строка не может пересекать границу страницы 8 КБ, поэтому длинные значения PostgreSQL сначала сжимает, а если всё равно не влезают - выносит во вторичную TOAST-таблицу чанками примерно по 2 КБ. Порог срабатывает около 2000 байт на строку. Управляется стратегией хранения: PLAIN, MAIN, EXTERNAL, EXTENDED.

  • visibility-mapVisibility Map (карта видимости)

    Карта видимости (_vm) держит по два бита на страницу: all-visible (все строки видны всем) и all-frozen (все строки заморожены). Первый бит позволяет index-only scan не ходить в таблицу за проверкой видимости, а вакууму - пропускать страницу. Биты ставит VACUUM и сбрасывает любая запись в страницу.

  • column-alignmentВыравнивание и порядок колонок

    Внутри строки колонки лежат с выравниванием: bigint и timestamp хотят начинаться с адреса, кратного 8, int - кратного 4. Между колонками PostgreSQL вставляет байты-заполнители (padding). Поэтому порядок колонок влияет на размер строки. Если расставить колонки от широких к узким, заполнителей становится меньше и строка занимает меньше места.

  • tuple-headerЗаголовок кортежа

    Перед данными каждой строки лежит служебный заголовок в 23 байта, выровненный до 24. В нём t_xmin и t_xmax (кто вставил и кто удалил версию), t_ctid (ссылка на себя или на новую версию), t_infomask с флагами и t_hoff - смещение до пользовательских данных. Это поля, на которых стоит весь MVCC.

  • cluster-pgdataКластер, PGDATA и каталоги

    Кластер PostgreSQL - это один каталог на диске (PGDATA) и один набор процессов, обслуживающий сразу несколько баз. Внутри PGDATA лежат base/ с данными баз, global/ с общими объектами, pg_wal/ с журналом и служебные каталоги вроде pg_xact/. Всё хранение начинается отсюда.

  • page-layoutРаскладка страницы 8 КБ

    Таблица на диске - это массив страниц по 8 КБ. Внутри страницы четыре зоны: заголовок 24 байта, массив указателей строк (растёт сверху вниз), свободное место и сами кортежи (растут снизу вверх). У heap-страницы спецзона в конце пустая. Указатели и кортежи движутся навстречу.

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