Индекс mars3_brin

Этот документ описывает внутреннюю механику, связанные функции и примеры использования индекса mars3_brin.

Обзор

Индекс mars3_brin — это встроенный разреженный индекс в YMatrix, полностью называемый MARS3 Block Range Index. Это структура индексирования на основе блоков-диапазонов. Вместо хранения отдельной записи индекса для каждой строки mars3_brin группирует данные по блокам и поддерживает сводную информацию для каждого диапазона блоков. Этот индекс особенно эффективен для упорядоченных наборов данных, таких как временные ряды или непрерывно изменяющиеся диапазоны.

+-------------------+
|  BRIN Index       |
+-------------------+
|  Block Range 1    |
|  Block Range 2    |
|  Block Range 3    |
|       ...         |
|  Block Range N    |
+-------------------+

Приведённая выше диаграмма иллюстрирует логическую структуру индекса mars3_brin. Индекс состоит из нескольких диапазонов блоков, каждый из которых представляет собой единицу индексирования, соответствующую диапазону данных. Во время выполнения запроса он повышает производительность, пропуская диапазоны блоков, не соответствующие условиям запроса (например, когда запрашиваемое значение не попадает между значениями min и max диапазона блока).

Индекс mars3_brin обычно создаётся на ключе сортировки, указанном при создании таблицы MARS3, что значительно повышает производительность запросов к таблицам MARS3. Использование mars3_brin на ключе сортировки эффективно, поскольку данные уже физически упорядочены по ключу сортировки при вставке. При построении индекса дополнительная сортировка не требуется — YMatrix напрямую сохраняет отсортированные в памяти значения столбца вместе с соответствующими rowid (которые записывают физическое расположение в памяти и являются уникальными) в доступные блоки индекса.

Внутренняя механика

Индекс mars3_brin хранит статистическую информацию для каждого диапазона, такую как минимальные (min/max) и максимальные (range ID) значения для каждого индексируемого столбца в пределах диапазона (см. 相关函数). Во время сканирования индекса YMatrix сначала использует значения min/max, чтобы определить, могут ли кортежи в диапазоне удовлетворять условию запроса. Если да или возможно, система извлекает данные этого диапазона для дальнейшей проверки; в противном случае переходит к следующему диапазону.

YMatrix использует значения min/max для оценки того, удовлетворяют ли кортежи в заданном диапазоне условию запроса, следующим образом:

  1. При создании индекса автоматически записываются минимальное (min) и максимальное (max) значения для каждого индексируемого столбца в каждом диапазоне блоков. Эти значения обновляются при изменении данных.

  2. Во время выполнения запроса YMatrix сравнивает значения min и max из условий запроса со значениями min и max, сохранёнными в индексе:

    • Если значение min запроса больше, чем max записи индекса, или значение max запроса меньше, чем min записи индекса, диапазон блоков исключается.
    • Если значение min запроса ≤ max индекса и значение max запроса ≥ min индекса, диапазон блоков может содержать совпадающие строки и должен быть дополнительно проверен.
  3. Для диапазонов блоков, прошедших этап 2, YMatrix обращается к фактическим строкам данных и проверяет их по полному условию запроса для подтверждения совпадений.

Связанные функции

Название функции Синтаксис Параметры Описание
mars3_info_brin SELECT * FROM matrixts_internal.mars3_info_brin('<索引名>'); Имя индекса Извлекает статистическую информацию об индексе mars3_brin (см. поля возврата ниже)

Поля возврата функции:

Поле Описание
segid Идентификатор сегмента
level Уровень хранения в MARS3 (0–9)
run Номер единицы хранения на этом уровне в MARS3
range Идентификатор единицы диапазона индекса (уникальный идентификатор)
placeholder Зарезервировано ли место для данных row-store (true/false)
attnum Количество столбцов. Обычные столбцы нумеруются начиная с 1; системные столбцы (например, ctid) имеют отрицательные номера
allnulls Все ли значения равны NULL (true/false)
hasnulls Существуют ли какие-либо значения NULL (true/false)
value Минимальные и максимальные значения столбца в данном диапазоне

Пример использования

Создайте расширение matrixts.

=# CREATE EXTENSION matrixts;

Создайте таблицу MARS3 t с колонками c1 и c2.

=# CREATE TABLE t(
c1 int,
c2 int)
USING MARS3
DISTRIBUTED BY (c1)
ORDER BY c1;

Вставьте 10000 строк случайных данных.

=# INSERT INTO t (c1, c2)
SELECT FLOOR(RANDOM() * 100), FLOOR(RANDOM() * 100)
FROM (
    SELECT generate_series(1, 10000)
) AS dummy;

Создайте индекс mars3_brin на ключе сортировки c1.

=# CREATE INDEX t_index ON t USING mars3_brin(c1);

Выполните vacuum для таблицы t, чтобы переместить данные row-store MARS3 на уровни column-store, где можно создавать индексы.

=# VACUUM t;

Просмотрите подробную информацию об индексе t_index.

=# SELECT * FROM matrixts_internal.mars3_info_brin('t_index');
 segid | level | run | range | placeholder | attnum | allnulls | hasnulls |   value
-------+-------+-----+-------+-------------+--------+----------+----------+------------
     0 |     1 |   2 |     0 | f           |      1 | f        | f        | {3 .. 99}
     0 |     1 |   3 |     0 | f           |      1 | f        | f        | {3 .. 51}
     0 |     1 |   3 |     1 | f           |      1 | f        | f        | {51 .. 93}
     0 |     1 |   3 |     2 | f           |      1 | f        | f        | {93 .. 99}
     2 |     1 |   2 |     0 | f           |      1 | f        | f        | {5 .. 73}
     2 |     1 |   3 |     0 | f           |      1 | f        | f        | {5 .. 58}
     2 |     1 |   3 |     1 | f           |      1 | f        | f        | {58 .. 73}
     3 |     1 |   2 |     0 | f           |      1 | f        | f        | {2 .. 96}
     3 |     1 |   3 |     0 | f           |      1 | f        | f        | {2 .. 37}
     3 |     1 |   3 |     1 | f           |      1 | f        | f        | {37 .. 92}
     3 |     1 |   3 |     2 | f           |      1 | f        | f        | {92 .. 96}
     1 |     1 |   2 |     0 | f           |      1 | f        | f        | {0 .. 98}
     1 |     1 |   3 |     0 | f           |      1 | f        | f        | {0 .. 49}
     1 |     1 |   3 |     1 | f           |      1 | f        | f        | {49 .. 83}
     1 |     1 |   3 |     2 | f           |      1 | f        | f        | {83 .. 98}
(15 rows)

См. также

MARS3 Storage Engine