Движок хранения MARS2 разработан в первую очередь для высокоскоростной загрузки и запросов данных, используя упорядоченное хранение для оптимизации поиска.
Таблица MARS2 аналогична MARS3 и также использует структуру LSM-дерева для хранения.
Схематическое представление внутреннего устройства MARS2:
_1688719834.png)
Далее мы пошагово проанализируем эту схему на концептуальном уровне.
COLLATE C в этом столбце ускорит процесс сортировки.mars2_automerge_threshold), запускается слияние L0, объединяющее все Run L0 в один Run.level0_upgrade_size), он переводится в L1.level1_upgrade_size), запускается слияние, объединяющее все 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 | Управляет количеством Run, при превышении которого запускается слияние в L0 для всех таблиц MARS2. Это глобальный параметр. Для индивидуальной настройки для отдельной таблицы используйте параметр таблицы level0_merge_threshold. |
| level0_merge_threshold | run | 32 | 1 - 2048 | Управляет количеством Run, при превышении которого запускается слияние. Параметр уровня таблицы. |
| level0_upgrade_size | MB | 25 | 1 - 10000 | Управляет размером перехода L0 → L1 для отдельной таблицы. Если размер результирующего Run после слияния L0 превышает этот порог, он переводится в L1. Параметр уровня таблицы. |
| level1_upgrade_size | MB | 1000 | 1 - 10000 | Управляет размером перехода L1 → L2 для отдельной таблицы. Если размер результирующего Run после слияния 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 (Multiversion Concurrency Control), или многоверсионное управление, в основном применяется для обновления, изменения и удаления данных.
При многоверсионном управлении обновления и удаления не обязательно изменяют исходные данные напрямую — вместо этого создается новая версия, старая версия помечается как недействительная, а новые данные добавляются в новую версию. Таким образом, данные могут иметь несколько версий, каждая из которых содержит информацию о версии, а исторические версии сохраняются.
Под влиянием механизма MVCC при обработке операций обновления и удаления в таблице HEAP данные физически не удаляются — вместо этого старые данные блокируются на основе информации о версии (контролируется видимость данных). Следовательно, при частых обновлениях и удалениях физический объем, занимаемый таблицей HEAP, будет постоянно расти, и необходимо регулярно и планово очищать устаревшие данные.
Для создания таблицы 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-таблицах инструмент очистки vacuumcum должен сбрасывать битовую карту и сжимать физические файлы, поэтому он обычно работает медленнее, чем в HEAP.
Примечание!
Подробности о движках хранения MARS2, HEAP и AO см. в разделе Лучшие практики проектирования таблиц