Что такое механизм TOAST в PostgreSQL и как он работает?

Ответ

Когда говорят об автоматическом хранении больших объектов в PostgreSQL, имеют в виду механизм TOAST (The Oversized-Attribute Storage Technique).

Это основной способ, которым PostgreSQL прозрачно для пользователя управляет значениями в полях (TEXT, JSONB, BYTEA, VARCHAR и др.), размер которых превышает ~2 КБ.

Как работает TOAST:


  1. Порог срабатывания: PostgreSQL хранит строки таблицы в "страницах" фиксированного размера (обычно 8 КБ). Если одна строка со всеми её полями не помещается на страницу, TOAST пытается решить эту проблему.



  2. Сжатие: Первым делом TOAST пытается сжать данные в "проблемных" полях с помощью быстрого алгоритма pglz. Если после сжатия строка помещается на страницу, данные так и хранятся в сжатом виде.



  3. Вынос "Out-of-line": Если сжатие не помогло, PostgreSQL выносит большие данные из основной таблицы в специальную служебную TOAST-таблицу. В основной таблице остается только небольшой "указатель" (pointer) на эти данные.



  4. Чанки: В TOAST-таблице данные нарезаются на фрагменты (чанки) размером до 2 КБ, что позволяет эффективно считывать только необходимые части больших объектов.


Этот механизм полностью прозрачен для приложения. Когда вы делаете SELECT, PostgreSQL автоматически "собирает" данные обратно: распаковывает или подтягивает из TOAST-таблицы.

Отличие от Large Objects (pg_largeobject):

Не стоит путать TOAST с API для Large Objects. Large Objects — это более старый, непрозрачный механизм. Он требует от разработчика явных действий:

  • Создать объект и получить его ID (lo_create).
  • Работать с ним как с файлом (открывать, читать, писать по частям, закрывать).
  • Хранить в таблице только ID этого объекта.

Large Objects полезны для хранения очень больших данных (сотни мегабайт или гигабайты), с которыми нужно работать потоково, не загружая их целиком в память.