Чтобы понять, почему ClickHouse так хорошо сжимает данные, рекомендуем прочитать эту статью. Вкратце: наша столбцовая база данных записывает значения по столбцам. Когда эти значения отсортированы, одинаковые значения оказываются рядом друг с другом, и алгоритмы сжатия эффективно используют повторяющиеся последовательности в данных. Кроме того, в ClickHouse есть кодеки и точные типы данных, которые позволяют легко дополнительно настроить сжатие.На сжатие в ClickHouse влияют 3 основных фактора:
- Ключ сортировки
- Типы данных
- Используемые кодеки
Выберите подходящий тип данных для оптимизации сжатия
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 удалось добиться значительной экономии за счёт упорядочивания данных перед сжатием и использования подходящих типов.
Выбор подходящего кодека сжатия для столбца
Дополнительные варианты см. здесь.
Ниже мы указываем кодек
Delta для Id, ViewCount и AnswerCount, предполагая, что они будут линейно коррелировать с ключом сортировки и, следовательно, выиграют от Delta-кодирования.
Сжатие в ClickHouse Cloud
ZSTD (с уровнем по умолчанию 1). Хотя скорость сжатия у этого алгоритма может варьироваться в зависимости от уровня сжатия (чем он выше, тем медленнее сжатие), его преимущество в том, что распаковка стабильно остаётся быстрой (разброс около 20%), а сам алгоритм хорошо распараллеливается. Наши многолетние тесты также показывают, что этот алгоритм часто оказывается достаточно эффективным и может даже превосходить LZ4 в сочетании с кодеком. Он хорошо работает для большинства типов данных и их распределений, поэтому является разумным универсальным выбором по умолчанию — именно поэтому даже исходное сжатие без дополнительной оптимизации уже даёт отличные результаты.