← Назад к вопросам

Как в PostgreSQL хранятся объекты размером больше 2 Кб?

2.0 Middle🔥 162 комментариев
#Базы данных#Производительность и оптимизация

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Хранение больших объектов (TOAST) в PostgreSQL

В PostgreSQL для эффективного хранения объектов, размер которых превышает 2 КБ, используется специальный механизм TOAST (The Oversized-Attribute Storage Technique). Это не просто дополнительная функция, а фундаментальная часть архитектуры СУБД, обеспечивающая корректную работу с большими данными.

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

При создании таблицы для каждого столбца с типом данных, поддерживающим TOAST (например, text, bytea, jsonb, массивы), автоматически создается сопутствующая TOAST-таблица. Основная таблица содержит лишь ссылку или часть данных, а сами "раздувшиеся" значения хранятся отдельно.

Пороговое значение 2 КБ — это конфигурируемый параметр toast_tuple_threshold. Когда размер строки в таблице приближается к этому лимиту (а фактически к размеру страницы 8 КБ), механизм TOAST активируется и применяет четыре стратегии сжатия/хранения:

-- Пример проверки TOAST-информации для таблицы
SELECT 
    attname,
    atttypid::regtype,
    attlen,
    attstorage
FROM pg_attribute
WHERE attrelid = 'your_table'::regclass
ORDER BY attnum;

Стратегии хранения TOAST (attstorage)

  1. PLAIN — запрещает сжатие и внешнее хранение (используется для типов фиксированной длины, например integer)

  2. EXTENDEDстратегия по умолчанию для большинства TOAST-совместимых типов:

    • Попытка сжатия данных
    • Если сжатые данные все еще велики — вынос в TOAST-таблицу
  3. EXTERNAL — хранение в TOAST-таблице без сжатия (полезно для уже сжатых данных типа JPEG)

  4. MAIN — попытка сжатия, но без гарантии выноса (оставляет в основной таблице, если есть место)

Пример настройки стратегии хранения

-- Создание таблицы с явным указанием стратегии хранения
CREATE TABLE documents (
    id serial PRIMARY KEY,
    -- Будет использовать EXTENDED (по умолчанию)
    content text,
    -- Явно указываем EXTERNAL для уже сжатых данных
    compressed_data bytea
);

-- Изменение стратегии хранения для существующего столбца
ALTER TABLE documents 
ALTER COLUMN compressed_data SET STORAGE EXTERNAL;

Архитектура TOAST-таблицы

Каждая TOAST-таблица имеет следующую структуру:

  • chunk_id — идентификатор TOAST-значения
  • chunk_seq — порядковый номер фрагмента (члeна)
  • chunk_data — сами данные (фрагмент)

Большие объекты разбиваются на фрагменты по примерно 2 КБ (точное значение — TOAST_MAX_CHUNK_SIZE минус заголовки).

Практические аспекты работы с TOAST

Преимущества:

  • Уменьшение размера основной таблицы
  • Улучшение производительности для операций с небольшими данными
  • Поддержка индексации даже для больших значений (индекс создается по "не TOAST-ленной" версии)

Особенности и ограничения:

-- Проверка размера TOAST-данных
SELECT 
    pg_size_pretty(pg_relation_size('table_name')) as main_table,
    pg_size_pretty(pg_relation_size('pg_toast.pg_toast_' || relfilenode)) as toast_table
FROM pg_class
WHERE relname = 'table_name';

-- Важно: TOAST-данные не включаются в стандартные дампы pg_dump
-- Для полного резервного копирования используйте физические бэкапы

Оптимизация работы с большими объектами

  1. Настройка параметров:

    -- Увеличение порога для специализированных таблиц
    ALTER TABLE large_content_table 
    SET (toast_tuple_threshold = 4096);
    
  2. Выбор правильных типов данных: используйте bytea для бинарных данных, text для текстовых.

  3. Мониторинг: регулярно проверяйте размер TOAST-таблиц, так как они могут фрагментироваться.

  4. Альтернативы: для экстремально больших объектов (гигабайты) рассмотрите Large Objects API (потоковое чтение/запись) или внешнее хранение.

Сравнение с другими СУБД

В отличие от PostgreSQL, другие системы используют разные подходы:

  • MySQL — использует BLOB/TEXT с отдельным хранением
  • Oracle — LOB-сегменты с аналогичной TOAST логикой
  • SQL Server — FILESTREAM и FileTable для выноса в файловую систему

Механизм TOAST делает PostgreSQL особенно эффективным для работы со смешанными рабочими нагрузками, где в одной таблице могут сосуществовать небольшие метаданные и крупный контент, обеспечивая оптимальный баланс между производительностью и гибкостью.

Как в PostgreSQL хранятся объекты размером больше 2 Кб? | PrepBro