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

Документ описывает алгоритмы сжатия, доступные в YMatrix, и способы их применения.

Алгоритмы общего назначения

Концепция

Сжатие общего назначения — это алгоритмы, которые работают без знания внутренней структуры данных. Эти алгоритмы напрямую сжимают блоки данных, кодируя бинарные паттерны для уменьшения избыточности. Сжатые данные не поддерживают случайный доступ и должны быть полностью распакованы как единый блок.

YMatrix поддерживает три алгоритма сжатия общего назначения для блоков данных: zlib, lz4 и zstd.

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

Алгоритмы сжатия lz4, zstd и zlib указываются при создании таблицы с помощью clauses WITH. Пример:

=# WITH (compresstype=zstd, compresslevel=3, compress_threshold=1200)

Примечание!
Дополнительную информацию о clauses WITH см. в разделе 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 не указаны, значение по умолчанию для compresstypezlib.
Если указан compresstype, но не указан compresslevel, значение по умолчанию для compresslevel1.

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

Цепочка кодирования

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

Концепция

В отличие от сжатия общего назначения, цепочка кодирования использует знания о внутреннем формате и семантике данных. В реляционных базах данных данные организованы в таблицы, где каждый столбец имеет фиксированный тип данных, что обеспечивает логическую схожесть значений в одном столбце. Во многих случаях соседние строки также демонстрируют схожесть данных. Сжатие и хранение данных по столбцам позволяют достичь значительно лучшего коэффициента сжатия.

Цепочка кодирования предоставляет следующие возможности:

  • Множество алгоритмов кодирования/сжатия: Разработаны серии алгоритмов кодирования и сжатия для различных типов данных и паттернов. Каждый алгоритм имеет специфические сценарии использования, коэффициенты сжатия и характеристики производительности. Тонкая настройка позволяет добиться оптимального сжатия.
  • Комбинированное сжатие: Алгоритмы кодирования на уровне столбца могут комбинироваться с алгоритмами общего назначения (например, zstd, lz4) для повышения эффективности сжатия.
  • Настройка на уровне столбца: Разные стратегии сжатия могут применяться к каждому столбцу отдельно, обеспечивая точный контроль. Несколько алгоритмов могут быть объединены в цепочку для многоуровневого сжатия одного столбца.

Преимущества

Цепочка кодирования обеспечивает значительные преимущества для временных рядов, которые характеризуются регулярными временными интервалами, независимостью столбцов и постепенными изменениями значений во времени. Алгоритмы общего назначения, такие как lz4 и zstd, работают с потоками байтов и не могут эффективно использовать эти закономерности, что приводит к неоптимальному сжатию.

Цепочка кодирования полностью использует особенности временных рядов для глубокого сжатия, обеспечивая три ключевых преимущества:

  • Снижение затрат на хранение: Уменьшение размера данных значительно снижает стоимость хранения, позволяя сохранять больше данных на том же аппаратном обеспечении.
  • Снижение нагрузки на диск I/O: Уменьшение объема данных снижает операции ввода-вывода, улучшая производительность запросов — особенно для I/O-интенсивных запросов к холодным данным, хранящимся на HDD.
  • Ускорение запросов: Специализированные алгоритмы проще и более оптимизированы, что обеспечивает более быстрое распаковывание и повышает скорость выполнения запросов.

Ограничения

  • Цепочка кодирования сильно зависит от характеристик данных и не является универсальным решением. Требуется тщательный выбор алгоритмов.
  • Поддерживается только для таблиц MARS2 и MARS3.

Примечание!
Самый простой способ использовать цепочку кодирования — включить режим Адаптивного кодирования (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).