Хранилище 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) можно оптимизировать под различные рабочие нагрузки.Перекрывающиеся диапазоны данных между Run вызывают усилённое чтение и снижают производительность запросов. Когда количество Run на диске превышает пороговое значение, MARS3 объединяет несколько Run в один с помощью внешней сортировки. Этот процесс называется слиянием.
Во время слияния данные остаются доступными для чтения и записи:
После завершения слияния исходные Run помечаются как устаревшие на основе идентификатора транзакции и переходят в состояние освобождения.
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 простейший способ создать таблицу 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);
Примечание!
Создание BRIN-индекса на таблицах MARS3 поддерживается, но не обязательно.
Начиная с версии 6.3.0, требование использовать предложениеORDER BYпри создании таблиц MARS3 было снято.
Примечание!
Эти параметры являются настройками на уровне таблицы. Они могут быть указаны только при создании таблицы с помощью предложенияWITH(mars3options='a=1,b=2,...')(за исключениемcompress_threshold, который совместим с MARS2 и может быть задан напрямую черезWITH). После установки их нельзя изменить. Эти настройки применяются к одной таблице. Подробнее см. Параметры таблиц базы данных.
Следующий параметр управляет размером Run в L0, косвенно влияя на размеры Run на более высоких уровнях.
| Параметр | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| rowstore_size | МБ | 64 | 8 – 1024 | Управляет моментом переключения Run уровня L0. Новый Run создаётся, когда объём данных превышает этот порог. |
Следующий параметр задаёт порог сжатия, балансируя эффективность сжатия и производительность чтения. Слишком низкое значение снижает эффективность сжатия; слишком высокое увеличивает потребление памяти.
| Параметр | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| compress_threshold | Кортежи | 1200 | 1 – 100000 | Порог сжатия. Максимальное количество кортежей на столбец, сжимаемых за одну партию. |
Следующий параметр задаёт режим загрузки данных в MARS3.
| Параметр | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| prefer_load_mode | normal | normal / bulk | Режим загрузки данных. normal означает нормальный режим: новые данные сначала записываются в Run в формате строк уровня L0, затем перемещаются в Run в столбцовом формате уровня L1 после достижения rowstore_size. Это требует дополнительного ввода-вывода по сравнению с bulk, а преобразование в столбцовый формат происходит асинхронно. Подходит для частых вставок малыми пакетами, когда ёмкость ввода-вывода достаточна, а задержка критична. bluk означает режим массовой загрузки: используется для редких, крупных пакетных вставок. Данные записываются напрямую в Run в столбцовом формате уровня L1, что снижает один ввод-вывод по сравнению с normal. Преобразование в столбцовый формат синхронно. Подходит для сценариев с ограниченной ёмкостью ввода-вывода и низкой чувствительностью к задержке. |
Следующий параметр управляет коэффициентом усиления размера уровня.
| Параметр | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| 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
) 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. Полезно для оценки состояния таблицы, например, выполняется ли слияние Run ожидаемым образом и находится ли количество Run в пределах нормы.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, объединяющее все Run L0 в один.level0_upgrade_size), он продвигается в L1.level1_upgrade_size), запускается слияние L1, объединяющее все Run L1 в один.level1_upgrade_size), он продвигается в L2.Сначала создайте расширение matrixts:
=# CREATE EXTENSION matrixts ;
Затем явно объявите запись min/max:
=# 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.Следующий параметр управляет поведением сжатия. Слишком низкое значение снижает эффективность сжатия, слишком высокое увеличивает потребление памяти.
| Параметр управления сжатием | Единица | Значение по умолчанию | Диапазон | Описание |
|---|---|---|---|---|
| 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. Он поддерживает только хранение по строкам, но не поддерживает хранение по столбцам или сжатие. На основе 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 поддерживает хранение по строкам; AOCO поддерживает хранение по столбцам.
AO-таблицы существенно отличаются от таблиц HEAP как логически, так и физически. Как описано ранее, таблицы HEAP используют MVCC для управления видимостью данных после обновлений и удалений. В отличие от них, AO-таблицы используют вспомогательную битмап-таблицу для отслеживания видимых строк.
Для AO-таблиц с частыми обновлениями и удалениями также требуется регулярная очистка. Однако инструмент очистки vacuum должен сбрасывать битмап и сжимать физические файлы, что обычно занимает больше времени, чем очистка HEAP.
Примечание!
Для подробной информации о движках хранения, использовании и лучших практиках см. Лучшие практики проектирования таблиц.