Перейти к основному содержанию
Один из секретов высокой производительности запросов к ClickHouse — сжатие. Меньше данных на диске означает меньше операций ввода-вывода и более быстрые запросы и вставки. Нагрузка на CPU от любого алгоритма сжатия в большинстве случаев с лихвой окупается уменьшением объема ввода-вывода. Поэтому при работе над ускорением запросов к ClickHouse в первую очередь стоит обратить внимание на улучшение сжатия данных.
Чтобы понять, почему ClickHouse так хорошо сжимает данные, рекомендуем прочитать эту статью. Вкратце: наша столбцовая база данных записывает значения по столбцам. Когда эти значения отсортированы, одинаковые значения оказываются рядом друг с другом, и алгоритмы сжатия эффективно используют повторяющиеся последовательности в данных. Кроме того, в ClickHouse есть кодеки и точные типы данных, которые позволяют легко дополнительно настроить сжатие.
На сжатие в ClickHouse влияют 3 основных фактора:
  • Ключ сортировки
  • Типы данных
  • Используемые кодеки
Все они настраиваются через схему.

Выберите подходящий тип данных для оптимизации сжатия

В качестве примера возьмём набор данных Stack Overflow. Сравним статистику сжатия для следующих схем таблицы posts:
  • posts - Схема без оптимизации типов и без ключа сортировки.
  • posts_v3 - Схема с оптимизированными типами, где для каждого столбца выбран подходящий тип и битность, с ключом сортировки (PostTypeId, toDate(CreationDate), CommentCount).
С помощью следующих запросов можно измерить текущий сжатый и несжатый размер каждого столбца. Рассмотрим размер исходной схемы posts без ключа сортировки.
Если вы видите значения compressed_size или uncompressed_size, равные 0, это может быть связано с тем, что тип частей — compact, а не wide (см. описание part_type в system.parts). Формат части задаётся настройками min_bytes_for_wide_part и min_rows_for_wide_part, то есть если вставленные данные приводят к созданию части, которая не превышает значения вышеупомянутых настроек, часть будет компактной, а не широкой, и вы не увидите значений compressed_size или uncompressed_size.Чтобы продемонстрировать это:
Запрос
Ответ
Здесь мы показываем как сжатый, так и несжатый размер. Оба показателя важны. Сжатый размер соответствует объёму данных, который нужно считывать с диска, а его желательно минимизировать ради производительности запросов (и снижения стоимости хранения). Перед чтением эти данные нужно распаковать. В данном случае величина несжатого размера зависит от используемого типа данных. Уменьшение этого размера снижает накладные расходы на память при выполнении запросов и объём данных, которые запросу нужно обработать, улучшает использование кэша и в итоге сокращает время выполнения запросов.
Приведённый выше запрос использует таблицу columns в системной базе данных. Этой базой данных управляет ClickHouse, и она представляет собой настоящий кладезь полезной информации: от метрик производительности запросов до фоновых журналов кластера. Если вам интересно, рекомендуем статью “System Tables and a Window into the Internals of ClickHouse” и связанные с ней статьи[1][2].
Чтобы получить суммарный размер таблицы, можно упростить приведённый выше запрос:
Повторив этот запрос для posts_v3 — таблицы с оптимизированным типом и ключом сортировки, — мы увидим значительное уменьшение размера данных в сжатом и несжатом виде.
Подробная разбивка по столбцам показывает, что для столбцов Body, Title, Tags и CreationDate удалось добиться значительной экономии за счёт упорядочивания данных перед сжатием и использования подходящих типов.

Выбор подходящего кодека сжатия для столбца

С помощью кодеков сжатия столбцов можно изменить алгоритм (и его настройки), используемый для кодирования и сжатия каждого столбца. Кодирование и сжатие работают немного по-разному, но преследуют одну и ту же цель: уменьшить объём данных. Кодирование применяет к данным преобразование, изменяя значения на основе функции и используя свойства типа данных. Сжатие же использует универсальный алгоритм, который сжимает данные на уровне байтов. Обычно сначала применяется кодирование, а затем — сжатие. Поскольку разные кодировки и алгоритмы сжатия эффективны для разных распределений значений, важно понимать особенности своих данных. ClickHouse поддерживает большое количество кодеков и алгоритмов сжатия. Ниже приведены некоторые рекомендации в порядке важности: Дополнительные варианты см. здесь. Ниже мы указываем кодек Delta для Id, ViewCount и AnswerCount, предполагая, что они будут линейно коррелировать с ключом сортировки и, следовательно, выиграют от Delta-кодирования.
Ниже показаны улучшения сжатия для этих столбцов:

Сжатие в ClickHouse Cloud

В ClickHouse Cloud мы по умолчанию используем алгоритм сжатия ZSTD (с уровнем по умолчанию 1). Хотя скорость сжатия у этого алгоритма может варьироваться в зависимости от уровня сжатия (чем он выше, тем медленнее сжатие), его преимущество в том, что распаковка стабильно остаётся быстрой (разброс около 20%), а сам алгоритм хорошо распараллеливается. Наши многолетние тесты также показывают, что этот алгоритм часто оказывается достаточно эффективным и может даже превосходить LZ4 в сочетании с кодеком. Он хорошо работает для большинства типов данных и их распределений, поэтому является разумным универсальным выбором по умолчанию — именно поэтому даже исходное сжатие без дополнительной оптимизации уже даёт отличные результаты.
Последнее изменение 19 июня 2026 г.