BRIN (от ) — техника индексации данных, предназначенная для обработки большихБольших в смысле количества строк, а не размера полей или абсолютного размера таблицы в байтах. таблиц, в которых значение индексируемого столбца имеет некоторую естественную корреляцию с физическим положением строки в таблице. Они обладают такими качествами партиционированных таблиц, как быстрая вставка строки, быстрое создание индекса, без необходимости явного объявления партиций.

Может использоваться для географических данных, временных рядов, логов или истории заказов магазина, которые пишутся последовательно, а потому некоторые колонки (дата, время, номер) частично упорядочены уже на физическом уровне, и в то же время таблицы с такими данными обычно разрастаются до гигантских размеров. Ускоряет операторы сравнения, но не влияет на like-запросы.. BRIN — не уникальный индекс, поэтому не может использоваться в качестве индекса первичного ключа.

BRIN-индексы были впервые предложены Alvaro Herrera из компании 2ndQuadrant в 2013 году под названием «Minmax-индексы». Поддержка была заявлена в PostgreSQL с версии 9.5. В других СУБД есть похожие возможности, в том числе в Oracle, Netezza («zone maps»), :en:Infobright («data packs»), :en:MonetDBand, Apache Hive с ORC/Parquet.

Архитектура

BRIN оперирует описаниями больших блоков данных, где хранится минимальное и максимальное значение индексируемого столбца внутри блока. Во время запросов сначала фильтруются блоки (условия запроса применяется к описанию блока). Таким образом, за небольшое число проверок сокращается набор данных, которые надо будет проверять построчно.

СУБД PostgreSQL хранит данные в «страницах», каждая таблица или индекс — это последовательность страниц. Стандартный размер страницы — 8 килобайт. Блок или блоковый диапазон (англ. «a block range») — это группа страниц (а не строк), которые идут друг за другом в таблице. Блок в данном случае — часть индекса, а не таблицы: его размер можно определить в момент создания индекса параметром pages_per_range.

По мере того, как страницы наполняются данными, информация о блоках обновляется. Не каждой странице соответствует блок, недавно созданные страницы могут не иметь блока (создание новых блоков в индексе происходит, например, во время операции VACUUM на таблице).

BRIN настолько компактный, что может помещаться целиком в оперативную память, уменьшая количество дисковых операций во время запроса. Это не всегда справедливо для индексов B-tree, которые нуждаются в узле дерева на приблизительно каждые N строк таблицы, где N — вместимость одного узла. Размер индекса B-tree значителен и может быть сопоставим с объёмом данных в индексируемой колонке таблицы.

См. также

GiST — индекс для like-запросов. Gin — еще один индекс для like-запросов. Он в 3 раза медленнее обновляется, чем GiST, но в 3 раза быстрее находит данные.

Примечания

Ссылки PostgreSQL Documentation : Chapter 62. BRIN Indexes (Глава 62. Индексы BRIN) 11.2. Index Types Table 62-1. Built-in BRIN Operator Classes

Категория:Техники индексации данных Категория:PostgreSQL