Страницы, heap и TOAST
Зачем это знать аналитику:
-
“Сколько строк” не равно “сколько I/O”. PostgreSQL работает страницами.
-
Многие “почему медленно” объясняются тем, что читается heap/TOAST, а не индекс.
Связанные темы:
Память, кэш и I/O
Как хранится таблица (heap)
-
Таблица — это набор страниц (pages) на диске.
-
Строки (tuples) лежат внутри страниц.
-
UPDATE в PostgreSQL обычно создаёт новую версию строки (MVCC), а старая остаётся до VACUUM.
TOAST (крупные значения)
-
Большие поля (например, длинный текст/JSON) могут выноситься в отдельное хранилище TOAST.
-
Итог: запрос может казаться “простым”, но тянуть большие значения из TOAST ⇒ дополнительные чтения.
Практическое следствие:
-
SELECT “широких” колонок дороже, чем SELECT только нужных полей.
-
Иногда помогает сделать “узкие” индексы/таблицы, нормализацию или хранить большие payload отдельно.
Почему “широкие строки” дорогие
-
Меньше строк помещается в одну страницу.
-
Для одного и того же количества строк нужно читать больше страниц.