Движок хранения MARS3 использует гибридный метод хранения строк-столбцов для достижения высокой скорости записи данных и экстремальной степени сжатия.
MARS3 поддерживает обновление и удаление данных через ключевые слова UPDATE и DELETE (за исключением режима Unique).
MARS3 поддерживает добавление и удаление столбцов, а также операции COPY и pg_dump.
Для каждой отдельной таблицы MARS3 внутреннее хранение использует структуру LSM-дерева (Log-Structured Merge Tree). LSM-дерево — это иерархическая, упорядоченная, ориентированная на диск структура данных. Её основной принцип заключается в максимальном использовании производительности диска для пакетных последовательных операций записи, что обеспечивает значительно более высокую производительность по сравнению со случайными записями.
Внутренняя архитектура MARS3 представлена ниже:
_1688719823.png)
Мы проанализируем приведённую выше диаграмму по уровням в концептуальном виде.
prefer_load_mode. Подробности см. в разделе параметры конфигурации.rowstore_size) можно гибко изменять для оптимизации производительности в различных сценариях.CREATE INDEX brin_idx ON t1 USING mars3_brin(time,tag_id);Dead данные, хотя вы также можете запланировать регулярное использование VACUUM для очистки Dead данных.INSERT, затем записываются в Run уровня L0.DELETE для удаления. Удаления записываются в Delta-файл, соответствующий Run, а фактическое удаление данных происходит во время слияния Run.UPDATE для обновления. Обновление сначала удаляет исходные данные, а затем повторно вставляет новую запись.UPDATE; достаточно выполнить команду INSERT, чтобы автоматически завершить операцию. Для обновления конкретной записи, связанной с уникальным ключом (то есть значением ключа, заданного при создании таблицы), просто вставьте новую запись с тем же уникальным ключом. Например, CREATE TABLE mars3_t(c1 int NOT NULL, c2 int) USING MARS3 WITH (uniquemode=true) ORDER BY (c1, c2);, где уникальный ключ — (c1, c2).Примечания!
Если включен режим Unique, первое поле в предложенииORDER BYдолжно быть определено с ограничениемNOT NULL.
Предположим, что расширение matrixts уже создано. Простейший способ создания таблицы — добавить предложение USING к оператору CREATE TABLE и добавить предложение ORDER BY. Дополнительные примеры см. в разделе Лучшие практики проектирования таблиц.
=# CREATE TABLE metrics (
ts timestamp,
dev_id bigint,
power float,
speed float,
message text
) USING MARS3
ORDER BY (dev_id,ts);
Примечания!
Таблица MARS3 поддерживает создание Brin-индексов, но это не обязательно; таблица MARS3 обязана использовать предложениеORDER BYдля задания ключа сортировки.
Примечания!
Данные параметры конфигурации являются параметрами на уровне таблицы. Вы можете использовать конфигурацию через предложениеWITH(mars3options='a=1,b=2,...')только при создании таблиц (за исключением параметраcompress_threshold, который также поддерживается MARS2, и который можно настраивать только через предложениеWITH). Подходит для отдельной таблицы и не может быть изменён после настройки. Подробнее см. Параметры конфигурации таблицы данных.
Следующие параметры используются для настройки размера Run уровня L0, а также косвенно влияют на размер Run выше уровня L1.
| Параметр | Единицы | Значение по умолчанию | Диапазон значений | Описание |
|---|---|---|---|---|
| rowstore_size | МБ | 64 | 8 ~ 1024 | Используется для управления переключением Run уровня L0. Когда объём данных превышает это значение, следующий Run переключается |
Следующие параметры используются для установки порога сжатия, что позволяет настроить эффект сжатия и повысить эффективность чтения. Если порог сжатия установлен слишком низко, эффект сжатия может быть незначительным; если установлен слишком высоко, потребление памяти возрастает.
| Параметр | Единицы | Значение по умолчанию | Диапазон значений | Описание |
|---|---|---|---|---|
| compress_threshold | Кортежи | 1200 | 1 ~ 100000 | Порог сжатия. Используется для управления количеством кортежей (кортежей) в каждом столбце одной таблицы, сжимаемых за один раз, что является верхним пределом числа сжимаемых кортежей в одной единице |
Следующие параметры используются для указания режима загрузки данных в MARS3.
| Параметр | Единицы | Значение по умолчанию | Диапазон значений | Описание |
|---|---|---|---|---|
| prefer_load_mode | normal | normal / bulk | Режим загрузки данных. normal обозначает нормальный режим. Новые данные сначала записываются в строковый Run уровня L0. После накопления в rowstore_size столбцовый Run переходит на уровень L1. По сравнению с режимом bulk, преобразование в столбцовый формат становится асинхронным, что подходит для сценариев с частыми мелкими пакетами записи при достаточной пропускной способности I/O и чувствительности к задержкам; bluk обозначает режим пакетной загрузки, подходящий для сценариев с редкими крупными пакетами записи, при котором данные напрямую записываются в столбцовый Run уровня L1. По сравнению с режимом normal, сокращается одна операция I/O. Преобразование в столбцовый формат становится синхронным, что подходит для сценариев с редкими крупными пакетами записи, при недостаточной пропускной способности I/O и низкой чувствительности к задержкам |
Следующие параметры используются для указания коэффициента увеличения размера уровня.
| Параметр | Единицы | Значение по умолчанию | Диапазон значений | Описание |
| -- | -- | -- | -- | -- | -- | -- |
| level_size_amplifier | | 8 | 1 ~ 1000 | Коэффициент увеличения размера уровня. Порог для запуска операции слияния рассчитывается как: rowstore_size * (level_size_amplifier ^ level). Чем больше значение, тем медленнее скорость чтения и быстрее скорость записи. Конкретное значение можно определить на основе информации о конкретном сценарии (больше записей, меньше чтений, коэффициент сжатия и т.д.). Примечание: Убедитесь, что количество Run на уровне не превышает допустимое число, иначе это повлияет на производительность запросов и даже может препятствовать вставке новых данных |
Пример конфигурации:
=# CREATE TABLE metrics (
ts timestamp,
dev_id bigint,
power float,
speed float,
message text
) USING MARS3
WITH (compress_threshold=1200,mars3options='rowstore_size=64')
ORDER BY (dev_id,ts);
matrixts_internal.mars3_level_stats: Проверяет состояние каждого уровня MARS3-таблицы, позволяя оценить её состояние, например, выполнилось ли слияние Run, как ожидалось, соответствует ли их количество ожидаемому и т.д.;matrixts_internal.mars3_files: Проверяет состояние файлов MARS3-таблицы, позволяя увидеть, соответствуют ли расширенные и инкрементальные файлы таблицы MARS3 (файлы данных, Delta-файлы, Index-файлы и т.д.) ожиданиям;matrixts_internal.mars3_info_brin: Просматривает состояние Brin-индекса в MARS3-таблице.Движок хранения MARS2 разработан в первую очередь для высокоскоростной загрузки и запросов данных, используя упорядоченное хранение для ускорения поиска.
Таблица MARS2 аналогична MARS3 и также использует структуру LSM-дерева и хранится. Внутренняя схема MARS2 представлена ниже: Мы интерпретируем приведённую выше диаграмму по уровням в концептуальном виде.
COLLATE C в этом столбце ускорит сортировку.mars2_automerge_threshold), запускается слияние L0, объединяющее все Run L0 в один Run.level0_upgrade_size), он повышается до L1.level1_upgrade_size) после повышения до L1, запускается слияние, объединяющее все Run L1 в один Run.level1_upgrade_size), он повышается до L2.Сначала создайте расширение matrixts:
=# CREATE EXTENSION matrixts ;
Явное объявление записи минимальных и максимальных значений.
=# CREATE TABLE metrics (
ts timestamp ENCODING(minmax),
dev_id bigint ENCODING(minmax),
power float,
speed float,
message text
) USING MARS2;
Создание индекса mars2_btree.
=# CREATE INDEX ON metrics
USING mars2_btree (ts, dev_id);
То же, что и в MARS3.
INSERT, после чего проходят через указанные процессы для формирования Run.TRUNCATE партиционированной таблицы.При условии, что расширение matrixts уже создано, простейший способ создания таблицы — добавить к оператору CREATE TABLE ключевое слово USING и создать индекс. Примеры расширенного использования см. в разделе Лучшие практики проектирования таблиц.
=# CREATE TABLE metrics (
ts timestamp,
dev_id bigint,
power float,
speed float,
message text
) USING MARS2;
=# CREATE INDEX ON metrics
USING mars2_btree (ts, dev_id);
Примечание!
Следующие параметры на уровне таблицы — это параметры, которые можно настраивать только с помощью ключевого словаWITHпри создании таблицы. Они подходят для отдельных таблиц и не могут быть изменены после настройки. Глобальные параметры — это параметры, которые можно настраивать на уровне сессии или системы; для изменения на уровне системы необходимо выполнитьmxstop -u. Подробнее см. Параметры конфигурации таблиц.
Следующие параметры управляют слияниями (Merge), и их влияние на слияния описано в разделе «Уровни» выше.
| Параметры управления слиянием | Единицы | Значение по умолчанию | Диапазон значений | Описание |
|---|---|---|---|---|
| mars2_automerge_threshold | run | 32 | 10 - 2048 | Управляет всеми таблицами MARS2: сколько Run должно накопиться в L0, чтобы запустить слияние. Это глобальный параметр. Для индивидуальной настройки для отдельной таблицы используйте параметр таблицы level0_merge_threshold. |
| level0_merge_threshold | run | 32 | 1 - 2048 | Управляет количеством Run, при достижении которого запускается слияние. Это параметр на уровне таблицы. |
| level0_upgrade_size | MB | 25 | 1 - 10000 | Управляет размером повышения уровня L0 → L1 для отдельной таблицы. Если результат слияния L0 превышает этот размер, он повышается до L1. Это параметр на уровне таблицы. |
| level1_upgrade_size | MB | 1000 | 1 - 10000 | Управляет размером повышения уровня L1 → L2 для отдельной таблицы. Если результат слияния L1 превышает этот размер, он повышается до L2. Это параметр на уровне таблицы. |
Следующие параметры управляют сжатием и влияют на его эффективность. Если при слишком низких значениях эффект сжатия незаметен, а при слишком высоких — увеличивается потребление памяти.
| Параметры управления сжатием | Единицы | Значение по умолчанию | Диапазон значений | Описание |
|---|---|---|---|---|
| compress_threshold | Tuple | 1200 | 1 - 100000 | Порог сжатия. Управляет количеством кортежей (tuples), подлежащих сжатию в одной таблице. Это максимальное количество кортежей, сжимаемых в одном блоке. Это параметр на уровне таблицы. |
Следующие параметры управляют памятью. Эти параметры определяют объём памяти для сортировки при вставке данных. При вставке в несколько партиций каждая партиция выделяет память, указанную в mars2_sort_mem_core; если её недостаточно, объём увеличивается, но общий объём не превышает mars2_sort_mem.
| Параметры памяти для сортировки | Единицы | Значение по умолчанию | Диапазон значений | Описание |
|---|---|---|---|---|
| mars2_sort_mem | KB | 2097152KB (2 ГБ) | 128KB - 2147483647KB (~2048 ГБ) | Управляет объёмом памяти для сортировки при каждой отдельной вставке. Если целевая таблица является партиционированной, все партиции делят этот объём памяти. Это глобальный параметр. |
| mars2_sort_mem_core | KB | 16384KB (16 МБ) | 128KB - 2147483647KB (~2048 ГБ) | Управляет минимальным объёмом памяти, выделяемым для каждой отдельной партиции. Это глобальный параметр. |
Примеры параметров на уровне таблицы:
=# CREATE TABLE metrics (
ts timestamp,
dev_id bigint,
power float,
speed float,
message text
)
USING MARS2
WITH (compress_threshold=1200,level0_merge_threshold=32);
=# CREATE INDEX ON metrics
USING mars2_btree (ts, dev_id);
Пример изменения значений глобальных параметров на уровне сессии:
=# SET mars2_sort_mem TO 2097152;
Пример изменения значений глобальных параметров на уровне системы:
=# gpconfig -c mars2_sort_mem -v 2097152
=# \q
$ mxstop -u
HEAP — это стандартный движок хранения YMatrix, также известный как heap-хранилище, унаследованный от PostgreSQL. Поддерживает только строковое хранение, не поддерживает колоночное хранение и сжатие. Реализован на основе механизма MVCC и подходит для сценариев с большим количеством операций обновления и удаления.
Под влиянием механизма MVCC таблица HEAP не удаляет данные физически при выполнении операций обновления и удаления, а лишь использует информацию о версиях данных для скрытия старых данных (контролирует их видимость). Поэтому при массовом обновлении или удалении данных физический объём, занимаемый таблицей HEAP, будет постоянно расти, и необходимо регулярно выполнять VACUUM для плановой очистки устаревших данных.
Таблицу HEAP в YMatrix можно создать с помощью следующего SQL-запроса:
=# CREATE TABLE disk_heap(
time timestamp with time zone,
tag_id int,
read float,
write float
)
DISTRIBUTED BY (tag_id);
Таблицы с движками хранения AOCO и AORO объединяются под общим названием AO (Append-Optimized) — таблицы с оптимизацией на добавление. Они поддерживают операции вставки, обновления и удаления, а также сжатие. AORO поддерживает строковое хранение, AOCO — колоночное.
Логическая и физическая структура таблиц AO существенно отличается от структуры таблиц HEAP. Как упоминалось ранее, таблицы HEAP используют механизм MVCC для контроля видимости данных после обновлений и удалений, тогда как таблицы AO используют дополнительную битмап-таблицу, в которой указывается, какие данные в таблице AO являются видимыми.
Для таблиц AO с большим количеством операций обновления и удаления старые данные также требуют регулярной очистки по расписанию. Однако в таблицах AO инструмент очистки данных vacuum требует сброса битмапа и сжатия физических файлов, поэтому он обычно работает медленнее, чем в HEAP.
Примечание!
Для подробной информации о движках хранения, их использовании и лучших практиках см. Лучшие практики проектирования таблиц.