В YMatrix можно использовать общие алгоритмы сжатия: lz4, zstd и zlib. Параметры задаются в операторах WITH, например, WITH (compresstype=zstd, compresslevel=3).
| Параметр | Значение по умолчанию | Минимальное значение | Максимальное значение | Описание |
|---|---|---|---|---|
| compress_threshold | 1200 | 1 | 8000 | Порог сжатия. Определяет, сколько кортежей (tuples) сжимается в одной таблице за раз, и является верхним пределом количества сжимаемых кортежей в одной единице. |
| compresstype | none | Алгоритм сжатия, поддерживаемые значения: 1. zstd 2. zlib 3. lz4 |
||
| compresslevel | 0 | 1 | Уровень сжатия. Чем меньше значение, тем быстрее сжатие, но хуже результат; чем больше значение, тем медленнее сжатие, но лучше результат. Разные алгоритмы имеют разные допустимые диапазоны значений: zstd: 1–19 zlib: 1–9 lz4: 1–20 |
Примечание!
Еслиcompresslevel > 0иcompresstypeне указаны, по умолчанию используетсяcompresstype— zlib.
Если указанcompresstype, но не указанcompresslevel, по умолчанию используетсяcompresslevel— 1.
Примечание!
Как правило, чем выше уровень сжатия, тем выше коэффициент сжатия и ниже скорость. Однако это не абсолютное правило.
Помимо общих алгоритмов сжатия, рекомендуем попробовать собственный разработанный YMatrix алгоритм — кодирующую цепочку (mxcustom). Данные временных рядов обладают выраженными характеристиками: регулярные интервалы времени, независимость между столбцами, постепенность изменений во времени и т.д. Общие алгоритмы сжатия, такие как lz4 и zstd, ориентированы на потоки байтов и не учитывают эти особенности, поэтому их результаты часто далеки от оптимальных.
Кодирующая цепочка эффективно использует специфику данных временных рядов для глубокого сжатия таблиц. Преимущества глубокого сжатия:
| Алгоритм | Поддерживаемые параметры | Описание |
|---|---|---|
| lz4 & zstd | compresslevel | Кодирующая цепочка включает lz4 и zstd в состав комбинаций кодирования и использует системные библиотеки для сжатия и декомпрессии. lz4 подходит для сценариев, где важна скорость, особенно скорость декомпрессии. zstd более сбалансирован. При уровне сжатия по умолчанию скорость декомпрессии lz4 значительно выше, чем у zstd, а коэффициент сжатия zstd явно выше. Как правило, чем выше уровень сжатия zstd, тем выше коэффициент сжатия и ниже скорость. Однако это не абсолютное правило. |
| deltadelta | Масштабирующий коэффициент (опционально). Масштабирующий коэффициент — это количество бит, на которые сдвигается значение. Например, deltadelta(7) означает, что разница масштабируется на 7 бит, а затем сохраняется. По умолчанию масштабирование не применяется | Принцип Delta заключается в вычислении вторичной разницы между соседними значениями, что особенно эффективно для отсортированных временных меток. Результат обработки строго упорядоченной последовательности временных меток без пропусков — последовательность нулей, что обеспечивает отличное сжатие. Если некоторые временные метки отсутствуют, разница может остаться большой. deltadelta поддерживает только целые числа и подходит для случаев, когда вторичная разница — небольшое целое число. |
| deltazigzag | Масштабирующий коэффициент (опционально) | Принцип deltazigzag: сначала вычисляется разница, затем применяется zigzag-кодирование для преобразования отрицательных чисел в положительные, после чего используется переменная длина целого числа для сжатия. Подходит для последовательностей целых чисел с небольшими интервалами, без требований к сортировке. |
| Gorilla | Кодирование Gorilla предназначено для сжатия чисел с плавающей точкой. Принцип — выполнение операции XOR между текущим значением и предыдущим, чтобы сжать нулевые префиксы и суффиксы. В настоящее время поддерживается только тип double (8 байт как единица данных). | |
| Floatint | Масштабирующий коэффициент (обязательный) | В некоторых случаях сжатие Floatint неэффективно. Например, в сценарии временных рядов транспортных средств, широта и долгота автомобиля — медленно меняющиеся значения с плавающей точкой, и коэффициент сжатия с Gorilla почти равен нулю. Комбинация floatint и deltadelta может достигать более чем в десять раз лучшего результата. Это происходит потому, что числа с плавающей точкой имеют специфическую внутреннюю структуру, и изменения между соседними значениями малы. Операция XOR не всегда даёт много нулей, но целочисленная последовательность после масштабирования сохраняет схожесть и легче сжимается. Важно: масштабирование floatint вносит определённую потерю точности, и ошибка зависит от масштабирующего коэффициента. При коэффициенте 4 максимальная ошибка составляет 0.0001. |
| simple8b | simple8b подходит для целых чисел с небольшим диапазоном. Принцип — хранение нескольких малых целых чисел в 8 байтах. Например, если данные содержат целые числа < 8, то каждые 3 числа помещаются в один байт, обеспечивая лучшее сжатие. В таких случаях lz4 может давать плохой результат из-за нерегулярности данных. |
Основные функции кодирующей цепочки представлены в таблице:
| Номер | Использование |
|---|---|
| 1 | Сжатие на уровне столбца |
| 2 | Сжатие на уровне таблицы (поддерживает изменение алгоритма) |
| 3 | Указание сжатия как на уровне таблицы, так и на уровне столбца |
| 4 | Адаптивное кодирование (AutoEncode) |
Методы использования описаны ниже. Независимо от выбранного способа, необходимо сначала создать расширение.
CREATE EXTENSION matrixts;
Настройка пользовательских алгоритмов сжатия для каждого столбца таблицы t1. encodechain используется для указания комбинации кодирования, параметры помещаются в скобки и разделяются запятыми, как показано ниже.
=# CREATE EXTENSION matrixts;
=# CREATE TABLE t1(
f1 int8 ENCODING(encodechain='deltadelta(7)', compresstype='mxcustom'),
f2 int8 ENCODING(encodechain='lz4', compresstype='mxcustom')
)
USING MARS2;
Создание индекса mars2_btree.
=# CREATE INDEX t1_index ON t1
USING mars2_btree(f1);
Также можно указать сжатие на уровне столбца с помощью следующего SQL-запроса.
=# CREATE TABLE t1_1(
f1 int8,COLUMN f1 ENCODING (encodechain='lz4', compresstype='mxcustom'),
f2 int8,COLUMN f2 ENCODING(encodechain='lz4', compresstype='mxcustom')
)
USING MARS2;
=# CREATE INDEX t1_1_index ON t1_1
USING mars2_btree(f1);
DEFAULT COLUMN ENCODING означает, что по умолчанию для всех столбцов задаётся конкретный алгоритм сжатия, что эквивалентно сжатию на уровне таблицы.
=# CREATE TABLE t1_2(
f1 int8,
f2 int8,
DEFAULT COLUMN ENCODING (encodechain='auto', compresstype='mxcustom')
)
USING MARS2;
=# CREATE INDEX t1_2_index ON t1_2
USING mars2_btree(f1);
Предположим, вы хотите применить алгоритм сжатия zstd к таблице t2 на уровне таблицы. Есть два варианта: использовать кодирующую цепочку или не использовать её. Основное различие заключается в том, что при использовании кодирующей цепочки для сжатия на уровне таблицы можно изменить алгоритм сжатия с помощью SQL-запросов после создания таблицы.
Если вы используете кодирующую цепочку для сжатия таблицы t2 на основе алгоритма zstd, пример будет следующим:
=# CREATE TABLE t2 (
f1 int8
, f2 int8
)
USING MARS2
WITH(
compresstype=mxcustom
, encodechain=zstd
);
=# CREATE INDEX t2_index ON t2
USING mars2_btree(f1);
Изменение алгоритма сжатия на уровне таблицы на адаптивное кодирование:
=# ALTER TABLE t2 SET (encodechain=auto);
Примечание!
encodechainприменяется только к таблицам MARS2. Вы можете использовать традиционный метод сжатия в таблицах MARS2, как и раньше — например, указывать сжатие на уровне таблицы в операторе WITH.
В примере для таблицы t3 задан алгоритм сжатия auto, а для столбца f1 — lz4. Поскольку указание сжатия на уровне столбца имеет приоритет над указанием на уровне таблицы (за исключением случая ENCODING(compresstype=none)/ENCODING(minmax), см. ниже), столбец f1 будет сжат с помощью lz4, а остальные столбцы таблицы t3 (например, f2) — с использованием адаптивного кодирования.
=# CREATE TABLE t3 (
f1 int8 ENCODING(compresstype=lz4)
, f2 int8
)
USING MARS2
WITH(
compresstype=mxcustom
, encodechain=auto
);
Кодирующая цепочка YMatrix поддерживает адаптивное кодирование: система в режиме реального времени анализирует характеристики данных и автоматически выбирает оптимальный набор методов кодирования.
Применение адаптивного кодирования на уровне таблицы для таблицы t4 (encodechain=auto должен быть явно указан).
=# CREATE TABLE t4 (
f1 int8
, f2 int8
)
USING MARS2
WITH(
compresstype=mxcustom
, encodechain=auto
);
Указание на уровне таблицы lz4 и адаптивного кодирования на уровне столбца для таблицы t4. В этом случае столбец f2 использует алгоритм уровня таблицы, поскольку для него не указан конкретный алгоритм сжатия.
=# CREATE TABLE t4 (
f1 int8 ENCODING(encodechain=auto,compresstype=mxcustom)
, f2 int8
)
USING MARS2
WITH(
compresstype=mxcustom,
, encodechain=lz4
);
Указание на уровне таблицы lz4 и алгоритма кодирующей цепочки none для таблицы t4. В этом случае столбец f1 не сжимается, столбец f2 не имеет специфического алгоритма — используется алгоритм уровня таблицы.
=# CREATE TABLE t4 (
f1 int8 ENCODING(encodechain=none,compresstype=mxcustom)
, f2 int8
)
USING MARS2
WITH(
compresstype=mxcustom,
, encodechain=lz4
);
Одновременное указание на уровне таблицы алгоритма кодирующей цепочки lz4 и на уровне столбца — некодирующей цепочки none для таблицы t4. В этом случае сжатие столбцов f1 и f2 с помощью некодирующей цепочки будет переопределено алгоритмом кодирующей цепочки уровня таблицы.
=# CREATE TABLE t4 (
f1 int8 ENCODING(compresstype=none)
, f2 int8 ENCODING(minmax)
)
USING MARS2
WITH(
compresstype=mxcustom,
, encodechain=lz4
);
При функции адаптивного кодирования на уровне таблицы поддерживаются режимы Automode: приоритет коэффициента сжатия и приоритет скорости. В примере для таблицы t4 включён режим приоритета коэффициента сжатия. automode=1 означает приоритет коэффициента сжатия, automode=2 — приоритет скорости.
## automode=1, auto for cost
## automode=2, auto for speed
CREATE TABLE t4 (
f1 int8
, f2 int8
)
USING MARS2
WITH(
compresstype=mxcustom
, automode=1
);