Страницы, heap и TOAST

Зачем это знать аналитику:

  • “Сколько строк” не равно “сколько I/O”. PostgreSQL работает страницами.

  • Многие “почему медленно” объясняются тем, что читается heap/TOAST, а не индекс.

Связанные темы:

Методы доступа к данным

Память, кэш и I/O

VACUUM, Autovacuum и bloat


Как хранится таблица (heap)

  • Таблица — это набор страниц (pages) на диске.

  • Строки (tuples) лежат внутри страниц.

  • UPDATE в PostgreSQL обычно создаёт новую версию строки (MVCC), а старая остаётся до VACUUM.


TOAST (крупные значения)

  • Большие поля (например, длинный текст/JSON) могут выноситься в отдельное хранилище TOAST.

  • Итог: запрос может казаться “простым”, но тянуть большие значения из TOAST ⇒ дополнительные чтения.

Практическое следствие:

  • SELECT “широких” колонок дороже, чем SELECT только нужных полей.

  • Иногда помогает сделать “узкие” индексы/таблицы, нормализацию или хранить большие payload отдельно.


Почему “широкие строки” дорогие

  • Меньше строк помещается в одну страницу.

  • Для одного и того же количества строк нужно читать больше страниц.

Последнее обновление