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/kb/Индексы/brin-index

kb/indexes ── Индексы ── intermediate

BRIN: block range index

BRIN хранит сводку min/max на диапазон блоков (по умолчанию 128 страниц), а не запись на строку - индекс крошечный. Работает только при физической корреляции (append-only время); на перемешанных данных бесполезен.

view as markdownaka: brin, block-range-index

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; выбор типа - в index-design.

§ команды

bash
CREATE INDEX ON t USING brin (col);

Крошечный индекс для append-only коррелированной колонки

bash
SELECT correlation FROM pg_stats WHERE tablename='t' AND attname='c';

Тест пригодности BRIN (около ±1 - годится)

§ см. также

  • btree-structureB-tree: структура и спускB-tree - сбалансированное дерево из 8-КБ страниц: meta page указывает на корень, внутренние страницы хранят разделители и downlink, листья - ключ и ctid. Большой fanout даёт 3-4 уровня на миллиарды строк.
  • index-designПроектирование индексовИндекс - отсортированный список. Составной (a,b,c) работает по префиксу слева направо, не по средней колонке. Покрывающие (INCLUDE), частичные (WHERE) и по выражению сужают работу; лишние индексы - налог на запись.
  • operator-classesOperator classes и выбор индексаИндекс работает не «на колонке», а для конкретных операторов над ней. Связь тип+оператор+метод доступа задаёт operator class. Через каталог pg_amop можно узнать, какой AM поддерживает оператор: @> знают gin и gist, не btree.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки