Быстрый старт
Развертывание
Моделирование данных
Подключение
Запись данных
Миграция
Запросы
Операции и обслуживание
Типовое обслуживание
Секционирование
Резервное копирование и восстановление
Масштабирование
Мониторинг
Настройка производительности
Устранение неполадок
Справочник
Руководство по инструментам
Типы данных
Хранилище данных
Выполняющая система
Потоковая передача
Восстановление после сбоев
Конфигурация
Индексы
Расширения
Справочник по SQL
Часто задаваемые вопросы
Этот документ описывает внутреннюю механику, связанные функции и примеры использования индекса 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 для оценки того, удовлетворяют ли кортежи в заданном диапазоне условию запроса, следующим образом:
При создании индекса автоматически записываются минимальное (min) и максимальное (max) значения для каждого индексируемого столбца в каждом диапазоне блоков. Эти значения обновляются при изменении данных.
Во время выполнения запроса YMatrix сравнивает значения min и max из условий запроса со значениями min и max, сохранёнными в индексе:
min запроса больше, чем max записи индекса, или значение max запроса меньше, чем min записи индекса, диапазон блоков исключается.min запроса ≤ max индекса и значение max запроса ≥ min индекса, диапазон блоков может содержать совпадающие строки и должен быть дополнительно проверен.Для диапазонов блоков, прошедших этап 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)