Найти в Дзене
Антон Рязанцев

Кодеки сжатия данных в ClickHouse

ClickHouse предоставляет различные кодеки сжатия для оптимизации хранения данных и производительности запросов. Выбор подходящего кодека зависит от типа данных и сценария использования. -- LZ4 (по умолчанию) - хороший баланс скорости и степени сжатия
CODEC(LZ4)
-- ZSTD - более высокое сжатие при разумной скорости
CODEC(ZSTD, level) -- уровень от 1 до 22 (по умолчанию 1)
-- LZ4HC - высокое сжатие, но медленнее чем LZ4
CODEC(LZ4HC, level) -- уровень от 3 до 12 (по умолчанию 9)
-- Multiple - каскадное сжатие (например, Delta + ZSTD)
CODEC(Delta, ZSTD) -- Delta - эффективен для последовательных значений (timestamp, счетчики)
CODEC(Delta)
-- DoubleDelta - для монотонных последовательностей (лучше чем Delta для временных рядов)
CODEC(DoubleDelta)
-- Gorilla - для значений с плавающей точкой в временных рядах
CODEC(Gorilla)
-- T64 - для целых чисел в ограниченном диапазоне
CODEC(T64) CREATE TABLE compressed_data (
timestamp DateTime CODEC(DoubleDelta, LZ4),
metric Float64 CODEC(
Оглавление

ClickHouse предоставляет различные кодеки сжатия для оптимизации хранения данных и производительности запросов. Выбор подходящего кодека зависит от типа данных и сценария использования.

Основные кодеки сжатия

1. Общие кодеки сжатия

-- LZ4 (по умолчанию) - хороший баланс скорости и степени сжатия
CODEC(LZ4)

-- ZSTD - более высокое сжатие при разумной скорости
CODEC(ZSTD, level) -- уровень от 1 до 22 (по умолчанию 1)

-- LZ4HC - высокое сжатие, но медленнее чем LZ4
CODEC(LZ4HC, level) -- уровень от 3 до 12 (по умолчанию 9)

-- Multiple - каскадное сжатие (например, Delta + ZSTD)
CODEC(Delta, ZSTD)

2. Специализированные кодеки

-- Delta - эффективен для последовательных значений (timestamp, счетчики)
CODEC(Delta)

-- DoubleDelta - для монотонных последовательностей (лучше чем Delta для временных рядов)
CODEC(DoubleDelta)

-- Gorilla - для значений с плавающей точкой в временных рядах
CODEC(Gorilla)

-- T64 - для целых чисел в ограниченном диапазоне
CODEC(T64)

Примеры применения

При создании таблицы

CREATE TABLE compressed_data (
timestamp DateTime CODEC(DoubleDelta, LZ4),
metric Float64 CODEC(Gorilla),
user_id UInt32 CODEC(ZSTD(5)),
description String CODEC(ZSTD(10)),
flags UInt8 CODEC(T64)
) ENGINE = MergeTree()
ORDER BY timestamp;

Для изменения кодека существующей колонки

ALTER TABLE compressed_data MODIFY COLUMN description String CODEC(ZSTD(15));

Сравнение характеристик кодеков

*Для подходящих данных
*Для подходящих данных

Рекомендации по выбору кодеков

  1. Временные метки: DoubleDelta + LZ4 или DoubleDelta + ZSTD
  2. Метрики/числа: Gorilla для float, Delta или T64 для целых
  3. Высококардинальные ID: ZSTD с уровнем 3-5
  4. Текст/строки: ZSTD с уровнем 5-10
  5. Колонки с NULL: Часто не нужно сжатие (или LZ4)

Особенности работы

  1. ClickHouse применяет сжатие к каждому кусочку данных отдельно
  2. Кодеки можно комбинировать (например, Delta + ZSTD)
  3. Сжатие влияет на:Объем хранимых данных
    Скорость чтения (меньше данных > меньше I/O)
    Нагрузку на CPU (распаковка требует ресурсов)

Для выбора оптимальных кодеков анализируйте данные с помощью:

SELECT
column,
any(type),
sum(column_data_compressed_bytes) AS compressed,
sum(column_data_uncompressed_bytes) AS uncompressed,
uncompressed / compressed AS ratio
FROM system.parts_columns
WHERE table = 'your_table'
GROUP BY column
ORDER BY column;