69.1. Введение#

69.1. Введение

69.1. Введение

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

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

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

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

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

69.1.1. Обслуживание индексов

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

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

Наконец, можно использовать следующие функции:

brin_summarize_new_values(regclass) которая суммирует все несуммированные диапазоны;
brin_summarize_range(regclass, bigint) которая суммирует только диапазон, содержащий данную страницу, если он не был ранее суммирован.

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

LOG:  request for BRIN range summarization for index "brin_wi_idx" page 128 was not recorded

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

Обратно, диапазон может быть развернут с использованием функции brin_desummarize_range(regclass, bigint), которая полезна, когда кортеж индекса больше не является очень хорошим представлением, потому что существующие значения изменились. См. Раздел 9.27.8 для получения подробной информации.