# BRIN: block range index _Индексы · PostgreSQL Knowledge Base_ **TL;DR:** BRIN хранит сводку min/max на диапазон блоков (по умолчанию 128 страниц), а не запись на строку - индекс крошечный. Работает только при физической корреляции (append-only время); на перемешанных данных бесполезен. BRIN (Block Range INdex) - радикальный размен точности на размер. ## Сводка вместо адресов Вместо записи на строку BRIN хранит min/max на каждый диапазон блоков (`pages_per_range`, по умолчанию 128): ``` блоки 0-127: min=01-01 max=01-05 блоки 128-255: min=01-05 max=01-09 ``` Поиск отбрасывает диапазоны, чей интервал не содержит искомое; оставшиеся читает Bitmap Heap Scan с recheck (BRIN неточен). Размер растёт с числом диапазонов, не строк - индекс на гигабайтную таблицу умещается в килобайты. ## Условие пригодности: корреляция BRIN полезен, только когда физический порядок строк совпадает с порядком значений. Однострочный тест: ```sql SELECT correlation FROM pg_stats WHERE tablename='events' AND attname='at'; -- около ±1 → BRIN эффективен; около 0 → бесполезен ``` Идеальный случай - append-only таблица с временем. ## Когда вредит На перемешанных данных min/max каждого диапазона - почти весь домен, сводки ничего не отсекают, и BRIN хуже Seq Scan. UPDATE/DELETE разрушают корреляцию (MVCC кладёт версии в произвольные места), поэтому BRIN держат на таблицах, которые в основном дописываются. ```sql CREATE INDEX ON events USING brin (at); ``` Точный аналог для произвольных данных - [btree-structure](/courses/postgres/kb/btree-structure.md); выбор типа - в [index-design](/courses/postgres/kb/index-design.md). ## Команды ```sql CREATE INDEX ON t USING brin (col); ``` Крошечный индекс для append-only коррелированной колонки ```sql SELECT correlation FROM pg_stats WHERE tablename='t' AND attname='c'; ``` Тест пригодности BRIN (около ±1 - годится) ## См. также - [B-tree: структура и спуск](/courses/postgres/kb/btree-structure.md) - [Проектирование индексов](/courses/postgres/kb/index-design.md) - [Operator classes и выбор индекса](/courses/postgres/kb/operator-classes.md)