linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/lessons/pg-lab-08-1-toast-storage

lesson ── postgres-labs ── ~22 мин ── 4 шагов

Найди, где живёт большой текст

Положи в таблицу хорошо сжимаемое и несжимаемое значение и определи, где каждое осело. Перед каждым измерением предсказывай: останется ли значение в строке или уйдёт в TOAST-таблицу.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Хорошо сжимаемое значение

    Положи пять тысяч одинаковых букв. Логически это 5000 байт - проверь.

    sql
    CREATE TABLE toast_demo (id int, big text);
    INSERT INTO toast_demo VALUES (1, repeat('A', 5000));
    SELECT octet_length(big) FROM toast_demo WHERE id = 1;

    ✓ Логическая длина 5000 байт.

  2. 02

    Сжатие оставило значение в строке

    Предскажи pg_column_size: одинаковые буквы прекрасно сжимаются. Значение длиной 5000 байт после сжатия легко влезает в строку.

    sql
    SELECT pg_column_size(big) AS stored, octet_length(big) AS logical
    FROM toast_demo WHERE id = 1;
    подсказка

    Сжатый размер - десятки байт, а не тысячи.

    ✓ Сжалось до десятков байт и осталось в строке.

  3. 03

    Несжимаемое значение уходит наружу

    Положи случайный текст, который сжатие не берёт, - около 6400 байт. Предскажи: останется ли он в строке?

    sql
    INSERT INTO toast_demo
    SELECT 2, string_agg(md5(g::text), '') FROM generate_series(1, 200) g;
    SELECT pg_column_size(big) AS stored, octet_length(big) AS logical
    FROM toast_demo WHERE id = 2;
    подсказка

    Если stored примерно равен logical и велик - значение вынесено без сжатия.

    ✓ Сжатие не помогло, значение крупное - оно вынесено наружу.

  4. 04

    У таблицы есть TOAST-таблица

    Вынесенные значения лежат в отдельной TOAST-таблице. Найди её.

    sql
    SELECT reltoastrelid::regclass FROM pg_class WHERE relname = 'toast_demo';

    ✓ TOAST-таблица есть - в ней лежит вынесенное значение чанками.

Что ты узнал

TOAST сначала сжимает длинное значение: если влезает - оставляет в строке (5000 одинаковых букв сжались в десятки байт). Если сжатие не помогает (несжимаемые ~6400 байт), значение выносится в отдельную TOAST-таблицу.

команды

  • SELECT pg_column_size(big), octet_length(big) FROM t;физический размер против логического
  • SELECT reltoastrelid::regclass FROM pg_class WHERE relname='t';TOAST-таблица отношения

концепции

  • · сжимаемое значение остаётся в строке в сжатом виде
  • · несжимаемое длинное значение выносится в TOAST-таблицу чанками
  • · короткий SELECT без длинной колонки её чанки не читает

← предыдущая

Измерь, как порядок колонок меняет размер строки

следующая →

Увидь многоверсионность на двух сессиях

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки