Skip to main content
По умолчанию в самоуправляемой версии ClickHouse используется сжатие lz4, а в ClickHouse Cloud — zstd. Для таблиц семейства MergeTree метод сжатия по умолчанию можно изменить в разделе compression конфигурации сервера. Метод сжатия также можно задать для каждого отдельного столбца в запросе CREATE TABLE.
Кодек Default можно использовать для указания сжатия по умолчанию, которое во время выполнения может зависеть от различных настроек и свойств данных. Пример: value UInt64 CODEC(Default) — то же, что не указывать кодек. См. также Адаптивный выбор кодека. Также можно удалить текущий CODEC из столбца и использовать сжатие по умолчанию из config.xml:
Кодеки можно объединять в конвейер, например: CODEC(Delta, Default).
Файлы базы данных ClickHouse нельзя распаковать с помощью внешних утилит, таких как lz4. Вместо этого используйте специальную утилиту clickhouse-compressor.
Сжатие поддерживается следующими движками таблиц:
  • Семейство MergeTree. Поддерживает кодеки сжатия для столбцов и выбор метода сжатия по умолчанию в настройках сжатия.
  • Семейство Log. По умолчанию использует метод сжатия lz4 и поддерживает кодеки сжатия для столбцов.
  • Set. Поддерживается только сжатие по умолчанию.
  • Join. Поддерживается только сжатие по умолчанию.
ClickHouse поддерживает кодеки общего назначения и специализированные кодеки.

Кодеки общего назначения

NONE

NONE — без сжатия.

LZ4

LZ4 — алгоритм сжатия данных без потерь, используемый по умолчанию. Использует быстрое сжатие LZ4.

LZ4HC

LZ4HC[(level)] — алгоритм LZ4 HC (высокое сжатие) с настраиваемым уровнем. Уровень по умолчанию — 9. Если level <= 0, используется уровень по умолчанию. Возможные значения уровня: [1, 12]. Рекомендуемый диапазон значений: [4, 9].

ZSTD

ZSTD[(level)]алгоритм сжатия ZSTD с настраиваемым level. Допустимые уровни: [1, 22]. Уровень по умолчанию: 1. Высокие уровни сжатия полезны в асимметричных сценариях, например когда данные сжимаются один раз, а распаковываются многократно. Чем выше уровень, тем лучше сжатие и выше использование CPU.

ZXC

ZXC[(level)] — асимметричный алгоритм сжатия zxc с настраиваемым level. Возможные уровни: [1, 7]. Уровень по умолчанию: 3. ZXC обеспечивает очень быструю распаковку ценой медленного сжатия, с коэффициентом сжатия между LZ4 и ZSTD. Он хорошо подходит для сценария однократного сжатия и многократной распаковки и быстрее всего распаковывает данные на современных ядрах ARM. Более высокие уровни обеспечивают лучшее, но более медленное сжатие, при этом распаковка остаётся быстрой.
Этот кодек экспериментальный; для его использования требуется SET allow_experimental_codecs = 1.

Устарело: ZSTD_QAT

Устарело: DEFLATE_QPL

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

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

Delta

Delta(delta_bytes) — метод сжатия, при котором исходные значения заменяются разностью двух соседних значений, за исключением первого, которое остаётся без изменений. delta_bytes — максимальный размер исходных значений; значение по умолчанию — sizeof(type). Указание delta_bytes в качестве аргумента устарело; его поддержка будет удалена в одном из будущих релизов. Delta — кодек подготовки данных, то есть его нельзя использовать отдельно.

DoubleDelta

DoubleDelta(bytes_size) — Вычисляет разность дельт и записывает её в компактной двоичной форме. bytes_size имеет значение, аналогичное delta_bytes в кодеке Delta. Указание bytes_size в качестве аргумента устарело; его поддержка будет удалена в одном из будущих релизов. Оптимальная степень сжатия достигается для монотонных последовательностей с постоянным шагом, например данных временных рядов. Может использоваться с любым числовым типом. Реализует алгоритм, используемый в Gorilla TSDB, с расширением для поддержки 64-битных типов. Для 32-битных дельт используется 1 дополнительный бит: 5-битные префиксы вместо 4-битных. Дополнительные сведения см. в разделе Compressing Time Stamps статьи Gorilla: A Fast, Scalable, In-Memory Time Series Database. DoubleDelta — кодек подготовки данных, то есть его нельзя использовать отдельно.

GCD

GCD() — вычисляет наибольший общий делитель (GCD) значений в столбце, а затем делит каждое значение на GCD. Может использоваться со столбцами целочисленного и десятичного типов, а также типов даты/времени. Кодек хорошо подходит для столбцов со значениями, которые изменяются (увеличиваются или уменьшаются) с шагом, кратным GCD, например: 24, 28, 16, 24, 8, 24 (GCD = 4). GCD — кодек подготовки данных, то есть его нельзя использовать отдельно.

Gorilla

Gorilla(bytes_size) — вычисляет XOR между текущим и предыдущим значениями с плавающей запятой и записывает результат в компактной двоичной форме. Чем меньше разность между последовательными значениями, то есть чем медленнее изменяются значения серии, тем выше степень сжатия. Реализует алгоритм, используемый в Gorilla TSDB, расширяя его для поддержки 64-битных типов. Возможные значения bytes_size: 1, 2, 4, 8; значение по умолчанию — sizeof(type), если оно равно 1, 2, 4 или 8. Во всех остальных случаях — 1. Дополнительную информацию см. в разделе 4.1 статьи Gorilla: A Fast, Scalable, In-Memory Time Series Database.

ALP

ALP(variant) — адаптивное сжатие данных с плавающей запятой без потерь. Поддерживает Float32 и Float64. Подробнее см. ALP: Adaptive lossless floating-point compression. Кодек принимает необязательный аргумент варианта:
  • ALP() или ALP(AUTO) (по умолчанию) — использует STD и переходит к RD на основе оценки сжатого размера.
  • ALP(STD) — стандартный вариант ALP. Представляет каждое значение в виде точного масштабированного целого числа с использованием десятичных степеней, а затем сжимает полученные целые числа методом Frame-of-Reference и битовой упаковкой. Непредставимые значения сохраняются как необработанные исключения. Лучше всего подходит для чисел, полученных из десятичных значений (например, измерений или цен).
  • ALP(RD) — вариант Real Doubles. Переинтерпретирует битовый шаблон каждого значения и разделяет его на старшую часть (знак + экспонента + старшие биты мантиссы) и младшую часть. Старшие части кодируются словарём (до 8 элементов), младшие упаковываются по битам. Лучше всего подходит, когда у многих значений совпадают старшие биты.
Этот кодек экспериментальный; для его использования необходимо выполнить SET allow_experimental_codecs = 1.

FPC

FPC(level, float_size) — многократно предсказывает следующее значение с плавающей запятой в последовательности, выбирая лучший из двух предикторов, затем выполняет XOR фактического и предсказанного значений и сжимает результат по ведущим нулям. Как и Gorilla, этот кодек эффективен для хранения серий медленно изменяющихся значений с плавающей запятой. Для 64-битных значений (double) FPC быстрее Gorilla, а для 32-битных результаты могут различаться. Возможные значения level: 1–28, значение по умолчанию — 12. Возможные значения float_size: 4, 8; если тип — Float, значением по умолчанию является sizeof(type). Во всех остальных случаях используется 4. Подробное описание алгоритма см. в статье High Throughput Compression of Double-Precision Floating-Point Data.

SZ3

SZ3 или SZ3(algorithm, error_bound_mode, error_bound) — кодек с потерями и ограничением ошибки (SZ3 Lossy Compressor) для столбцов типов Float32, Float64, Array(Float32) и Array(Float64). Для столбцов типа Array сжатие наиболее эффективно, когда все массивы имеют одинаковую длину (в этом случае они сжимаются как векторы фиксированной ширины); массивы разной длины также поддерживаются и сжимаются как плоская последовательность значений. Кодек неприменим к столбцам Map, поскольку их ключи будут повреждены сжатием с потерями. Поддерживаемые значения algorithm: ALGO_LORENZO_REG, ALGO_INTERP_LORENZO и ALGO_INTERP. Поддерживаемые значения error_bound_mode: ABS, REL, PSNR и ABS_AND_REL. Аргумент error_bound задаёт максимальную ошибку и имеет тип Float64.
Этот кодек имеет экспериментальный статус; для его использования требуется SET allow_experimental_codecs = 1.

T64

T64 — метод сжатия, отбрасывающий неиспользуемые старшие биты значений целочисленных типов данных (включая Enum, Date и DateTime). На каждом шаге алгоритма кодек берёт блок из 64 значений, помещает их в битовую матрицу 64x64, транспонирует её, отбрасывает неиспользуемые биты значений и возвращает оставшиеся в виде последовательности. Неиспользуемые биты — это биты, не различающиеся между максимальным и минимальным значениями во всей части данных, для которой применяется сжатие. Кодеки DoubleDelta и Gorilla используются в Gorilla TSDB как компоненты алгоритма сжатия. Подход Gorilla эффективен для последовательностей медленно меняющихся значений с временными метками. Временные метки эффективно сжимаются кодеком DoubleDelta, а значения — кодеком Gorilla. Например, чтобы таблица хранилась эффективно, её можно создать со следующей конфигурацией:

Квантованный

Quantized(method, dimensions[, ...]) — специализированный кодек для приблизительного векторного поиска по столбцам типа Array(Float32), Array(Float64) или Array(BFloat16). Он хранит исходные векторы с полной точностью, а также компактный квантованный код для каждого вектора. В таблицах семейства MergeTree запросы векторного поиска с настройкой vector_search_use_quantized_codes сканируют квантованные коды для формирования списка кандидатов, а затем повторно оценивают результаты по векторам с полной точностью. Такой двухэтапный поиск считывает меньше байтов, чем обычное сканирование с полной точностью, но обеспечивает меньшую полноту результатов. dimensions — длина вектора; поддерживаемые значения method: rabitq, turboquant, int8, prefix и product. Каждое из них предполагает свой компромисс между размером, точностью и функцией расстояния. Кодек можно задать только в CREATE TABLE; его нельзя добавить, удалить или изменить с помощью ALTER TABLE, в том числе через ADD COLUMN ... CODEC(Quantized(...)). Его нельзя объединять в цепочку с другим кодеком, даже с кодеком шифрования, например AES_128_GCM_SIV. Подробнее см. в разделе Векторный поиск с квантованными кодеками.

Кодеки шифрования

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

AES_128_GCM_SIV

CODEC('AES-128-GCM-SIV') — шифрует данные с помощью AES-128 в режиме GCM-SIV, описанном в RFC 8452.

AES-256-GCM-SIV

CODEC('AES-256-GCM-SIV') — шифрует данные с помощью AES-256 в режиме GCM-SIV. Эти кодеки используют фиксированный nonce, поэтому шифрование является детерминированным. Это обеспечивает совместимость с движками, поддерживающими дедупликацию, такими как ReplicatedMergeTree, однако имеет недостаток: при повторном шифровании одного и того же блока данных результирующий шифротекст будет точно таким же. Поэтому злоумышленник, имеющий доступ к диску для чтения, сможет определить это совпадение (но не узнать содержимое данных).
Большинство движков, включая семейство “*MergeTree”, создают индексные файлы на диске без применения кодеков. Это означает, что открытый текст будет находиться на диске, если зашифрованный столбец индексирован.
Если вы выполняете SELECT-запрос с указанием конкретного значения в зашифрованном столбце (например, в предложении WHERE), это значение может появиться в system.query_log. Возможно, вам следует отключить логирование.
Пример
Если необходимо применить сжатие, его нужно указать явно. В противном случае к данным будет применено только шифрование.
Пример

Адаптивный выбор кодека

Описанные выше специализированные кодеки могут значительно уменьшить размер данных, однако их выбор требует опыта, и ни один из них не подходит для столбца, данные в котором меняются со временем. Если включена настройка MergeTree allow_experimental_adaptive_codec_selection, ClickHouse сделает выбор за вас. Для столбцов, использующих кодек по умолчанию (CODEC(Default) или вовсе без CODEC), каждый блок записывается с кодеком, который обеспечивает наименьший размер, выбранным среди кодека таблицы по умолчанию, NONE и специализированных кодеков, подходящих для типа столбца. Размер блока никогда не будет больше, чем при использовании кодека по умолчанию, а несжимаемые данные хранятся в исходном виде (их сжатие привело бы к созданию немного большего файла, который медленнее читается). Обработка выполняется в фоновом режиме — при слияниях и мутациях, когда данные в любом случае повторно сжимаются. Скорость вставки не меняется. Запросы часто выполняются быстрее: с диска считывается меньше данных, каждый блок, читаемый запросом, сначала необходимо распаковать, а специализированные кодеки распаковываются быстрее, чем стандартный LZ4. В каждом блоке сохраняется информация об использованном кодеке, поэтому для чтения не требуется никаких настроек, а эту возможность можно отключить в любой момент — все данные останутся доступными для чтения.
Работу этого механизма можно наблюдать с помощью табличной функции mergeTreeCodecBlockCounts. Здесь значение time непрерывно возрастает, поэтому T64, который хранит только изменяющиеся в пределах блока биты, превзошёл кодек по умолчанию в каждом блоке. user_id содержит хеши, которые не удаётся сжать ни одному кодеку, поэтому его блоки хранились в исходном виде:
В настоящее время выбор поддерживает следующие типы столбцов, близкие к целочисленным: целые числа, перечисления, даты и время, Decimal32/Decimal64 и IPv4.
Последнее изменение 14 августа 2026 г.