Движок хранения MARS3 построен на основе MARS2 с рядом оптимизаций. Он использует гибридный формат хранения строк-столбцов, что обеспечивает как высокую скорость ввода данных, так и агрессивное сжатие.
MARS3 поддерживает обновление и удаление данных с помощью ключевых слов UPDATE и DELETE (за исключением режима Unique).
MARS3 поддерживает добавление и удаление столбцов, а также операции COPY и pg_dump.
Каждая таблица MARS3 использует внутреннюю структуру LSM-дерева (Log-Structured Merge Tree). LSM-дерево — это многоуровневая, упорядоченная, ориентированная на диск структура данных. Её основная идея заключается в использовании производительности диска за счёт пакетных последовательных записей, что значительно превосходит производительность случайных записей.
Внутренняя архитектура MARS3 представлена ниже:
_1688719823.png)
Рассмотрим эту диаграмму по уровням.
COLLATE C к этому столбцу ускорит сортировку.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 и физически удаляются во время слияния.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 простейший способ создать таблицу MARS3 — добавить предложение CREATE TABLE с USING и 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). После установки их нельзя изменить. Эти параметры применяются к одной таблице. Подробнее см. Параметры таблиц базы данных.
Следующий параметр управляет размером Runs в L0, косвенно влияя на размеры Runs на более высоких уровнях.
| Параметр | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| rowstore_size | МБ | 64 | 8 ~ 1024 | Управляет моментом переключения L0 Run. Новый Run создаётся, когда объём данных превышает это значение. |
Следующий параметр задаёт порог сжатия, балансируя эффективность сжатия и производительность чтения. Слишком низкое значение снижает эффективность сжатия; слишком высокое увеличивает потребление памяти.
| Параметр | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| compress_threshold | Кортежи | 1200 | 1 ~ 100000 | Порог сжатия. Максимальное количество кортежей в одном столбце, сжимаемых за одну партию. |
Следующий параметр определяет режим загрузки данных в MARS3.
| Параметр | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| prefer_load_mode | normal | normal / bulk | Режим загрузки данных. normal означает нормальный режим: новые данные сначала записываются в rowstore Runs уровня L0, затем перемещаются в columnstore Runs уровня L1 после достижения rowstore_size. Это требует дополнительного I/O по сравнению с bulk, а преобразование в столбцы выполняется асинхронно. Подходит для частых, мелких записей, когда пропускная способность I/O достаточна, а задержка критична. bluk означает режим массовой загрузки: данные записываются непосредственно в columnstore Runs уровня L1. Это снижает I/O по сравнению с normal, а преобразование в столбцы выполняется синхронно. Подходит для редких, крупных пакетных записей, когда пропускная способность I/O ограничена, а задержка менее критична. |
Следующий параметр задаёт коэффициент увеличения размера уровня.
| Параметр | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| level_size_amplifier | 8 | 1 ~ 1000 | Коэффициент увеличения размера уровня. Порог для запуска слияния уровня: rowstore_size * (level_size_amplifier ^ level). Более высокое значение замедляет чтение, но ускоряет запись. Выбирайте на основе рабочей нагрузки (запись vs чтение, коэффициент сжатия и т.д.). Убедитесь, что количество Runs на уровне не становится слишком большим, иначе это может ухудшить производительность запросов или заблокировать новые вставки. |
Пример конфигурации:
=# CREATE TABLE metrics (
ts timestamp,
dev_id bigint,
power float,
speed float
) USING MARS3
WITH (compress_threshold=1200,mars3options='rowstore_size=64',compresstype=zstd, compresslevel=1)
DISTRIBUTED BY (dev_id)
ORDER BY (dev_id,ts)
PARTITION BY RANGE (ts)
( START ('2023-07-01 00:00:00') INCLUSIVE
END ('2023-08-01 00:00:00') EXCLUSIVE
EVERY (INTERVAL '1 day')
,DEFAULT PARTITION OTHERS);
matrixts_internal.mars3_level_stats: Просмотр состояния каждого уровня в таблице MARS3. Полезно для оценки состояния таблицы, например, выполняется ли слияние Runs по ожиданиям и находится ли количество Runs в пределах нормы.matrixts_internal.mars3_files: Просмотр состояния файлов таблицы MARS3, включая вспомогательные и delta-файлы (Data, Delta, Index и т.д.), для проверки ожидаемого состояния файлов.matrixts_internal.mars3_info_brin: Просмотр состояния конкретного BRIN-индекса на таблице MARS3.Движок хранения MARS2 разработан для высокоскоростной загрузки и запросов данных, используя упорядоченное хранение для исключения необходимости поиска.
Как и MARS3, MARS2 использует структуру LSM-дерева для хранения.
Внутренняя архитектура MARS2 представлена ниже:
_1688719834.png)
Рассмотрим эту диаграмму по уровням.
COLLATE C к этому столбцу ускорит сортировку.mars2_automerge_threshold), запускается слияние L0, объединяющее все Runs L0 в один.level0_upgrade_size), он продвигается в L1.level1_upgrade_size), запускается слияние L1, объединяющее все Runs L1 в один.level1_upgrade_size), он продвигается в L2.Сначала создайте расширение matrixts:
=# CREATE EXTENSION matrixts ;
Затем явно включите MINMAX:
=# 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 простейший способ создать таблицу MARS2 — использовать ключевое слово USING в CREATE TABLE и создать индекс. Подробные примеры см. в разделе Лучшие практики проектирования таблиц.
=# 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для применения. Подробнее см. Параметры таблиц базы данных.
Следующие параметры управляют поведением слияния (см. раздел «Уровни» выше).
| Параметр управления слиянием | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| mars2_automerge_threshold | run | 32 | 10 - 2048 | Управляет всеми таблицами MARS2: количество L0 Run, при достижении которого запускается слияние. Глобальный параметр. Переопределение на уровне таблицы: level0_merge_threshold |
| level0_merge_threshold | run | 32 | 1 - 2048 | Управляет порогом слияния L0 для каждой таблицы. Параметр на уровне таблицы |
| level0_upgrade_size | MB | 25 | 1 - 10000 | Управляет размером перехода L0 → L1 для каждой таблицы. Если объединённый Run превышает этот порог, он повышается до L1. Параметр на уровне таблицы |
| level1_upgrade_size | MB | 1000 | 1 - 10000 | Управляет размером перехода L1 → L2 для каждой таблицы. Если объединённый Run превышает этот порог, он повышается до L2. Параметр на уровне таблицы |
mars2_automerge_threshold / level0_merge_threshold, чтобы снизить частоту слияний.level0_upgrade_size / level1_upgrade_size, чтобы раньше повышать Run.Следующий параметр управляет поведением сжатия.
| Параметр управления сжатием | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| compress_threshold | Tuples | 1200 | 1 - 100000 | Порог сжатия. Количество кортежей на таблицу, сжимаемых за одну партию. Максимальное количество кортежей в единице сжатия. Параметр на уровне таблицы |
Следующие параметры управляют памятью для сортировки. При вставке в несколько партиционированных таблиц каждая получает 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, унаследованный от PostgreSQL. Он поддерживает только формат rowstore и не поддерживает columnstore или сжатие. Использует MVCC и подходит для рабочих нагрузок с частыми обновлениями и удалениями.
При использовании MVCC таблицы 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 поддерживает rowstore; AOCO поддерживает columnstore.
AO-таблицы существенно отличаются от таблиц HEAP как логически, так и физически. В то время как HEAP использует MVCC для управления видимостью данных после обновлений и удалений, AO-таблицы используют вспомогательную таблицу битмапов для отслеживания видимых строк.
Для AO-таблиц с частыми обновлениями и удалениями требуется регулярная очистка. Инструмент очистки vacuum должен сбрасывать битмап и сжимать физические файлы, что обычно медленнее, чем очистка HEAP через vacuum.
Примечание!
Для подробной информации о движках хранения, их использовании и лучших практиках см. Лучшие практики проектирования таблиц.