lesson ── postgres-labs ── ~22 мин ── 4 шагов
BRIN меняет точность на размер: вместо записи на строку - сводка min/max
на диапазон блоков. На упорядоченном временно́м ряде это крошечный
индекс. Построим его, сравним с B-tree и проверим корреляцию. Запусти
psql во вкладке client.
интерактивный sandbox
Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.
stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя
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.
✓ Миллион упорядоченных по времени строк готов.
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 по узкому окну.
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.
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концепции