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-36-1-brin

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

BRIN на временно́м ряде против B-tree

BRIN меняет точность на размер: вместо записи на строку - сводка min/max на диапазон блоков. На упорядоченном временно́м ряде это крошечный индекс. Построим его, сравним с B-tree и проверим корреляцию. Запусти psql во вкладке client.

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

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

запустить sandbox →

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

Шаги

  1. 01

    Создай упорядоченный append-only ряд

    sql
    CREATE TABLE events AS
    SELECT g id, '2026-01-01'::timestamptz + (g || ' seconds')::interval AS at
    FROM generate_series(1, 1000000) g;
    ANALYZE events;
    подсказка

    Время растёт вместе с номером строки - идеальная корреляция для BRIN.

    ✓ Миллион упорядоченных по времени строк готов.

  2. 02

    Построй BRIN и сделай диапазонный запрос

    sql
    CREATE INDEX e_brin ON events USING brin (at);
    ANALYZE events;
    EXPLAIN SELECT count(*) FROM events
    WHERE at BETWEEN '2026-01-05 10:00' AND '2026-01-05 11:00';

    Узкое окно - BRIN отсекает большинство диапазонов блоков, остальное читает Bitmap Heap Scan.

    подсказка

    BRIN всегда работает через Bitmap Heap Scan с recheck.

    ✓ BRIN отсёк лишние блоки - Bitmap Heap Scan по узкому окну.

  3. 03

    Сравни размер с B-tree

    sql
    CREATE INDEX e_btree ON events USING btree (at);
    SELECT pg_size_pretty(pg_relation_size('e_brin'))  AS brin,
           pg_size_pretty(pg_relation_size('e_btree')) AS btree;

    Предскажи разницу в порядках: BRIN хранит сводки, B-tree - запись на строку.

    подсказка

    BRIN растёт с числом диапазонов блоков, не строк.

    ✓ BRIN на порядки меньше B-tree.

  4. 04

    Проверь корреляцию - тест пригодности

    sql
    SELECT correlation FROM pg_stats WHERE tablename = 'events' AND attname = 'at';

    Около ±1 - физический порядок совпадает с порядком значений, BRIN эффективен. Перемешай данные (ORDER BY random() в новую таблицу) - и correlation упадёт к нулю, а BRIN перестанет отсекать блоки.

    подсказка

    correlation около ±1 - зелёный свет BRIN; около 0 - бесполезен.

    ✓ Корреляция близка к 1 - BRIN здесь уместен.

Что ты узнал

BRIN хранит сводку min/max на диапазон блоков, а не запись на строку - поэтому он на порядки меньше B-tree. Работает только при физической корреляции (порядок строк = порядок значений), идеально на append-only временны́х рядах. На перемешанных данных бесполезен; тест - correlation в pg_stats.

команды

  • CREATE INDEX ON t USING brin (col);крошечный индекс для коррелированной колонки
  • SELECT correlation FROM pg_stats WHERE tablename='t' AND attname='c';тест пригодности BRIN

концепции

  • · BRIN хранит min/max на диапазон блоков - размер ничтожный
  • · поиск отсекает диапазоны, остальное читает Bitmap Heap Scan
  • · нужна физическая корреляция (append-only, монотонная колонка)
  • · на перемешанных данных BRIN хуже Seq Scan

← предыдущая

btree проваливается на LIKE, GIN спасает полнотекст

следующая →

Составной индекс против Seq Scan плюс Sort

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