Документ описывает алгоритмы сжатия, доступные в YMatrix, и способы их применения.
Сжатие общего назначения — это алгоритмы, которые работают без знания внутренней структуры данных. Эти алгоритмы напрямую сжимают блоки данных, кодируя бинарные паттерны для уменьшения избыточности. Сжатые данные не поддерживают случайный доступ и должны быть полностью распакованы как единый блок.
YMatrix поддерживает три алгоритма сжатия общего назначения для блоков данных: zlib, lz4 и zstd.
Алгоритмы сжатия lz4, zstd и zlib указываются при создании таблицы с помощью clauses WITH. Пример:
=# WITH (compresstype=zstd, compresslevel=3, compress_threshold=1200)
Примечание!
Дополнительную информацию о clausesWITHсм. в разделе CREATE TABLE.
Описание параметров:
| Параметр | Значение по умолчанию | Минимум | Максимум | Описание |
|---|---|---|---|---|
| compress_threshold | 1200 | 1 | 8000 | Порог сжатия. Определяет, сколько кортежей сжимается за один блок. Задаёт максимальное количество кортежей в единице сжатия. |
| 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.
Примечание!
Как правило, более высокие уровни сжатия zstd обеспечивают лучший коэффициент, но снижают производительность. Однако это не всегда верно.
Помимо сжатия общего назначения, рекомендуется использовать проприетарный алгоритм YMatrix — цепочку кодирования (mxcustom).
В отличие от сжатия общего назначения, цепочка кодирования использует знания о внутреннем формате и семантике данных. В реляционных базах данных данные организованы в таблицы, где каждый столбец имеет фиксированный тип данных, что обеспечивает логическую схожесть значений в одном столбце. Во многих случаях соседние строки также демонстрируют схожесть данных. Сжатие и хранение данных по столбцам позволяют достичь значительно лучшего коэффициента сжатия.
Цепочка кодирования предоставляет следующие возможности:
Цепочка кодирования обеспечивает значительные преимущества для временных рядов, которые характеризуются регулярными временными интервалами, независимостью столбцов и постепенными изменениями значений во времени. Алгоритмы общего назначения, такие как lz4 и zstd, работают с потоками байтов и не могут эффективно использовать эти закономерности, что приводит к неоптимальному сжатию.
Цепочка кодирования полностью использует особенности временных рядов для глубокого сжатия, обеспечивая три ключевых преимущества:
Примечание!
Самый простой способ использовать цепочку кодирования — включить режим Адаптивного кодирования (AutoEncode), который автоматически определяет паттерны данных и выбирает подходящие методы кодирования во время выполнения. Подробности ниже.
Основные сценарии использования цепочки кодирования:
| № | Использование |
|---|---|
| 1 | Сжатие на уровне столбца |
| 2 | Сжатие на уровне таблицы (поддерживает изменение алгоритма) |
| 3 | Комбинированное сжатие на уровне таблицы и столбца |
| 4 | Адаптивное кодирование (AutoEncode) |
Перед использованием любого из этих методов создайте необходимое расширение:
=# CREATE EXTENSION matrixts;
Для каждого столбца в таблице t1 можно задать пользовательское сжатие. Клаузу ENCODING определяет цепочку кодирования (один или несколько алгоритмов, разделённых запятыми). Пример:
=# CREATE TABLE t1(
f1 int8 ENCODING(encodechain='deltadelta(7), zstd', compresstype='mxcustom'),
f2 int8 ENCODING(encodechain='lz4', compresstype='mxcustom')
)
USING MARS3
ORDER BY (f1);
Альтернативно, используйте следующий синтаксис:
=# CREATE TABLE t1_1(
f1 int8, COLUMN f1 ENCODING (encodechain='lz4, zstd', compresstype='mxcustom'),
f2 int8, COLUMN f2 ENCODING(encodechain='lz4', compresstype='mxcustom')
)
USING MARS3
ORDER BY (f1);
Использование DEFAULT COLUMN ENCODING применяет метод сжатия по умолчанию ко всем столбцам, что эквивалентно сжатию на уровне таблицы:
=# CREATE TABLE t1_2(
f1 int8,
f2 int8,
DEFAULT COLUMN ENCODING (encodechain='auto', compresstype='mxcustom')
)
USING MARS3
ORDER BY (f1);
Сжатие на уровне таблицы может применяться к таблице t2 с использованием либо цепочки кодирования, либо алгоритмов общего назначения. Ключевое отличие заключается в том, что только с цепочкой кодирования можно изменять алгоритм сжатия после создания таблицы через SQL.
Пример: Применить сжатие zstd на уровне таблицы с использованием цепочки кодирования:
=# CREATE TABLE t2_1 (
f1 int8,
f2 int8
)
USING MARS3
WITH(
compresstype='mxcustom',
encodechain='zstd'
)
ORDER BY (f1);
Пример: Применить цепочку сжатия zstd + lz4 на уровне таблицы:
=# CREATE TABLE t2_2 (
f1 int8,
f2 int8
)
USING MARS3
WITH(
compresstype='mxcustom',
encodechain='zstd, lz4'
)
ORDER BY (f1);
Изменить сжатие на уровне таблицы на адаптивное кодирование:
=# ALTER TABLE t2_1 SET (encodechain='auto');
В Примере 1 таблице t3_1 и столбцу f1 назначены сжатия lz4 и auto соответственно. Поскольку настройки на уровне столбца имеют приоритет, столбец f1 использует lz4, а остальные столбцы (например, f2) используют адаптивное кодирование.
=# CREATE TABLE t3_1 (
f1 int8 ENCODING(compresstype='lz4'),
f2 int8
)
USING MARS3
WITH(
compresstype='mxcustom',
encodechain='auto'
)
ORDER BY (f1);
В Примере 2 обе таблица t3_2 и столбец f1 имеют настройки сжатия. Столбец f1 использует указанную цепочку lz4, deltazigzag, а f2 наследует настройку сжатия на уровне таблицы auto.
=# CREATE TABLE t3_2 (
f1 int8 ENCODING(compresstype='mxcustom', encodechain='lz4, deltazigzag'),
f2 int8
)
USING MARS3
WITH(
compresstype='mxcustom',
encodechain='auto'
)
ORDER BY (f1);
Цепочка кодирования YMatrix поддерживает Адаптивное кодирование, при котором система автоматически выбирает оптимальный метод кодирования на основе характеристик данных во время выполнения.
Включите адаптивное кодирование на уровне таблицы для таблицы t4:
=# CREATE TABLE t4 (
f1 int8,
f2 int8
)
USING MARS3
WITH(
compresstype=mxcustom
)
ORDER BY (f1);
Альтернативно, явно укажите encodechain=auto. Оба метода допустимы.
=# CREATE TABLE t4 (
f1 int8,
f2 int8
)
USING MARS3
WITH(
compresstype=mxcustom,
encodechain=auto
)
ORDER BY (f1);
Примените адаптивное кодирование как на уровне таблицы, так и на уровне столбца для таблицы t5. Столбец f1 использует настройку на уровне столбца, а f2 наследует сжатие на уровне таблицы lz4.
=# CREATE TABLE t5 (
f1 int8 ENCODING (
compresstype=mxcustom,
encodechain=auto
),
f2 int8
)
USING MARS3
WITH(
compresstype=mxcustom,
encodechain=lz4
)
ORDER BY (f1);
В режиме адаптивного кодирования можно задать параметр automode на уровне таблицы для приоритизации либо коэффициента сжатия, либо скорости. Пример ниже включает режим приоритета коэффициента для таблицы t6. automode=1 приоритизирует коэффициент сжатия; automode=2 приоритизирует скорость.
-- automode=1, auto for cost
-- automode=2, auto for speed
=# CREATE TABLE t6 (
f1 int8,
f2 int8
)
USING MARS3
WITH(
compresstype=mxcustom,
automode=1
)
ORDER BY (f1);
Примечание!
Адаптивное кодирование нельзя комбинировать с другими алгоритмами сжатия.
| Алгоритм | Параметры | Описание |
|---|---|---|
| lz4 & zstd | compresslevel | Интегрирует lz4 и zstd в цепочку кодирования с использованием системных библиотек сжатия. lz4 превосходит по скорости, особенно при распаковке. zstd обеспечивает лучший баланс. При стандартных уровнях lz4 распаковывается быстрее, чем zstd, в то время как zstd достигает более высокого коэффициента сжатия. Как правило, более высокие уровни zstd дают лучший коэффициент, но снижают производительность — хотя существуют исключения. |
| deltadelta | Коэффициент масштабирования (опционально). Например, deltadelta(7) масштабирует разности на 7 бит перед хранением. По умолчанию: без масштабирования. |
Применяет вторичную дельта-кодировку, идеально подходящую для отсортированных временных меток без пропусков. Идеальная последовательность становится нулями, обеспечивая высокий коэффициент сжатия. Работает только с целыми числами и эффективна, когда вторичные разности малы. |
| deltazigzag | Коэффициент масштабирования (опционально) | Выполняет первичную дельта-кодировку, затем использует зигзаг-кодирование для преобразования отрицательных значений в положительные, после чего применяет переменную длину целочисленного кодирования. Подходит для столбцов с целыми числами небольшого диапазона без требований к упорядоченности. |
| Gorilla | Нет | Разработан для сжатия чисел с плавающей запятой. Использует XOR между последовательными значениями для устранения ведущих/заключительных нулей. В настоящее время поддерживает только double (8-байтовые) значения. |
| Gorilla2 | Нет | Улучшенная версия Gorilla, захватывающая более широкие паттерны данных. Обеспечивает значительно лучшее сжатие, чем Gorilla, в большинстве сценариев временных рядов. Достигает сопоставимого с zstd коэффициента сжатия и времени, но превосходит zstd по скорости распаковки. Поддерживает float4 и float8. |
| Floatint | Коэффициент масштабирования (обязательный) | Полезен, когда Gorilla плохо справляется с медленно меняющимися числами с плавающей запятой (например, координатами GPS). Преобразует числа с плавающей запятой в масштабированные целые числа перед сжатием. Примечание: Вводит потерю точности. Ошибка зависит от коэффициента масштабирования; например, коэффициент 4 означает максимальную ошибку 0.0001. |
| simple8b | Нет | Идеален для целых чисел небольшого диапазона. Упаковывает несколько малых целых чисел в 8 байт. Например, значения < 8 могут храниться по 3 бита каждое, обеспечивая хороший коэффициент сжатия. lz4 может плохо работать с такими нерегулярными данными. |
| fds | Нет | Разработан для случаев, когда столбцы с числами с плавающей запятой содержат целые значения (часто встречается в временных рядах). Обнаруживает целочисленные паттерны, преобразует их в двоичный целочисленный формат, затем сжимает. На наборе данных TSBS cpu-only (13 столбцов, 10 случайных целых чисел float8) fds достигает в 2 раза лучшего сжатия, чем zstd (30% от размера zstd). |