Ответ
Когда говорят об автоматическом хранении больших объектов в PostgreSQL, имеют в виду механизм TOAST (The Oversized-Attribute Storage Technique).
Это основной способ, которым PostgreSQL прозрачно для пользователя управляет значениями в полях (TEXT
, JSONB
, BYTEA
, VARCHAR
и др.), размер которых превышает ~2 КБ.
Как работает TOAST:
Порог срабатывания: PostgreSQL хранит строки таблицы в "страницах" фиксированного размера (обычно 8 КБ). Если одна строка со всеми её полями не помещается на страницу, TOAST пытается решить эту проблему.
Сжатие: Первым делом TOAST пытается сжать данные в "проблемных" полях с помощью быстрого алгоритма
pglz
. Если после сжатия строка помещается на страницу, данные так и хранятся в сжатом виде.Вынос "Out-of-line": Если сжатие не помогло, PostgreSQL выносит большие данные из основной таблицы в специальную служебную TOAST-таблицу. В основной таблице остается только небольшой "указатель" (pointer) на эти данные.
Чанки: В TOAST-таблице данные нарезаются на фрагменты (чанки) размером до 2 КБ, что позволяет эффективно считывать только необходимые части больших объектов.
Этот механизм полностью прозрачен для приложения. Когда вы делаете SELECT
, PostgreSQL автоматически "собирает" данные обратно: распаковывает или подтягивает из TOAST-таблицы.
Отличие от Large Objects (pg_largeobject
):
Не стоит путать TOAST с API для Large Objects. Large Objects — это более старый, непрозрачный механизм. Он требует от разработчика явных действий:
- Создать объект и получить его ID (
lo_create
). - Работать с ним как с файлом (открывать, читать, писать по частям, закрывать).
- Хранить в таблице только ID этого объекта.
Large Objects полезны для хранения очень больших данных (сотни мегабайт или гигабайты), с которыми нужно работать потоково, не загружая их целиком в память.