BRIN

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

BRIN (от англ. Block Range Index) — техника индексации данных, предназначенная для обработки очень больших таблиц, в которых определённые столбцы имеют некоторую естественную корреляцию с их физическим расположением в таблице. Реализован в PostgreSQL с версии 9.5.

В частности, используется при хранении географических данных[1].

Введение[править | править код]

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

Индексы BRIN могут удовлетворять запросы посредством регулярных проверок индексов битовых карт, и будут возвращать все кортежи на всех страницах в пределах каждого диапазона, если сводная информация, хранящаяся в индексе, согласуется с условиями запроса. Исполнитель запроса отвечает за повторную проверку этих кортежей и отбрасывание тех, которые не соответствуют условиям запроса. Поскольку индекс BRIN очень мал, сканирование индекса добавляет небольшие накладные расходы по сравнению с последовательным сканированием, но может позволить избежать сканирования больших частей таблицы, которые, как известно, не содержат совпадающих кортежей.

Размер диапазона блоков определяется во время создания индекса параметром хранилища pages_per_range. Количество записей индекса будет равно размеру отношений на страницах, деленном на выбранное значение для page_per_range. Таким образом, чем меньше число, тем больше индекс, но в то же время сохраняемые сводные данные могут быть более точными, и при индексировании можно пропускать больше блоков данных.

Встроенные классы операторов[править | править код]

Конкретные данные, которые сохранят индекс BRIN, а также конкретные запросы, которые индекс сможет удовлетворить, зависят от класса оператора, выбранного для каждого столбца индекса. Типы данных, имеющие линейный порядок сортировки, могут иметь классы операторов, которые хранят, например, минимальное и максимальное значения в каждом диапазоне блоков; Геометрические типы могут хранить ограничивающий прямоугольник для всех объектов в диапазоне блоков.

Таблица встроенных классов операторов[править | править код]

Основной дистрибутив PostgreSQL включает классы операторов BRIN, показанные ниже в таблице[2].

Имя Индексированный тип данных Индексируемые операторы
abstime_minmax_ops abstime < <= = >= >
int8_minmax_ops bigint < <= = >= >
bit_minmax_ops bit < <= = >= >
varbit_minmax_ops bit varying < <= = >= >
box_inclusion_ops box << &< && &> >> ~= @> <@ &<| <<| |>> |&>
bytea_minmax_ops bytea < <= = >= >
bpchar_minmax_ops character < <= = >= >
char_minmax_ops "char" < <= = >= >
date_minmax_ops date < <= = >= >
float8_minmax_ops double precision < <= = >= >
inet_minmax_ops inet < <= = >= >
network_inclusion_ops inet && >>= <<= = >> <<
int4_minmax_ops integer < <= = >= >
interval_minmax_ops interval < <= = >= >
macaddr_minmax_ops macaddr < <= = >= >
name_minmax_ops name < <= = >= >
numeric_minmax_ops numeric < <= = >= >
pg_lsn_minmax_ops pg_lsn < <= = >= >
oid_minmax_ops oid < <= = >= >
range_inclusion_ops any range type << &< && &> >> @> <@ -|- = < <= = > >=
float4_minmax_ops real < <= = >= >
reltime_minmax_ops reltime < <= = >= >
int2_minmax_ops smallint < <= = >= >
text_minmax_ops text < <= = >= >
tid_minmax_ops tid < <= = >= >
timestamp_minmax_ops timestamp without time zone < <= = >= >
timestamptz_minmax_ops timestamp with time zone < <= = >= >
time_minmax_ops time without time zone < <= = >= >
timetz_minmax_ops time with time zone < <= = >= >
uuid_minmax_ops uuid < <= = >= >

Примечания[править | править код]

Ссылки[править | править код]