Использование сжатия

В YMatrix можно использовать общие алгоритмы сжатия: lz4, zstd и zlib. Параметры задаются в операторах WITH, например, WITH (compresstype=zstd, compresslevel=3).

1. Общие алгоритмы сжатия

Параметр Значение по умолчанию Минимальное значение Максимальное значение Описание
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.

Примечание!
Как правило, чем выше уровень сжатия, тем выше коэффициент сжатия и ниже скорость. Однако это не абсолютное правило.

2. Кодирующая цепочка

Помимо общих алгоритмов сжатия, рекомендуем попробовать собственный разработанный YMatrix алгоритм — кодирующую цепочку (mxcustom). Данные временных рядов обладают выраженными характеристиками: регулярные интервалы времени, независимость между столбцами, постепенность изменений во времени и т.д. Общие алгоритмы сжатия, такие как lz4 и zstd, ориентированы на потоки байтов и не учитывают эти особенности, поэтому их результаты часто далеки от оптимальных.

Кодирующая цепочка эффективно использует специфику данных временных рядов для глубокого сжатия таблиц. Преимущества глубокого сжатия:

  • Значительная экономия затрат на хранение. Уменьшение размера данных существенно снижает стоимость хранения, позволяя разместить больше данных на том же оборудовании и увеличить объём хранимых активов.
  • Снижение нагрузки на диск I/O. Благодаря уменьшению объёма данных снижается нагрузка на диск. Это особенно заметно при запросах, требующих большого количества операций чтения/записи, особенно на жёстких дисках (HDD), в сценариях с «холодными» данными (редко запрашиваемыми).
  • Глубокая оптимизация, ускорение запросов. Целевые алгоритмы сжатия проще и позволяют глубже оптимизировать процесс, обеспечивая более высокую скорость декомпрессии и, как следствие, дополнительное ускорение запросов.

2.1 Введение

Алгоритм Поддерживаемые параметры Описание
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 может давать плохой результат из-за нерегулярности данных.

2.2 Использование

Основные функции кодирующей цепочки представлены в таблице:

Номер Использование
1 Сжатие на уровне столбца
2 Сжатие на уровне таблицы (поддерживает изменение алгоритма)
3 Указание сжатия как на уровне таблицы, так и на уровне столбца
4 Адаптивное кодирование (AutoEncode)

Методы использования описаны ниже. Независимо от выбранного способа, необходимо сначала создать расширение.

CREATE EXTENSION matrixts;

2.2.1 Сжатие на уровне столбца

Настройка пользовательских алгоритмов сжатия для каждого столбца таблицы 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);

2.2.2 Сжатие на уровне таблицы

Предположим, вы хотите применить алгоритм сжатия 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.

2.2.3 Указание сжатия как на уровне таблицы, так и на уровне столбца

В примере для таблицы 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
);

2.2.4 Адаптивное кодирование

Кодирующая цепочка YMatrix поддерживает адаптивное кодирование: система в режиме реального времени анализирует характеристики данных и автоматически выбирает оптимальный набор методов кодирования.

  1. Применение адаптивного кодирования на уровне таблицы для таблицы t4 (encodechain=auto должен быть явно указан).

    =# CREATE TABLE t4 (
       f1 int8
     , f2 int8
    ) 
    USING MARS2
    WITH(
       compresstype=mxcustom
     , encodechain=auto
    );
  2. Указание на уровне таблицы lz4 и адаптивного кодирования на уровне столбца для таблицы t4. В этом случае столбец f2 использует алгоритм уровня таблицы, поскольку для него не указан конкретный алгоритм сжатия.

    =# CREATE TABLE t4 (
       f1 int8 ENCODING(encodechain=auto,compresstype=mxcustom)
     , f2 int8 
    ) 
    USING MARS2
    WITH(
       compresstype=mxcustom,
     , encodechain=lz4
    );
  3. Указание на уровне таблицы lz4 и алгоритма кодирующей цепочки none для таблицы t4. В этом случае столбец f1 не сжимается, столбец f2 не имеет специфического алгоритма — используется алгоритм уровня таблицы.

    =# CREATE TABLE t4 (
       f1 int8 ENCODING(encodechain=none,compresstype=mxcustom)
     , f2 int8 
    ) 
    USING MARS2
    WITH(
       compresstype=mxcustom,
     , encodechain=lz4
    );
  4. Одновременное указание на уровне таблицы алгоритма кодирующей цепочки 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
);