> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Кодеки сжатия столбцов для оператора CREATE TABLE

# Кодеки сжатия столбцов

export const ExperimentalBadge = () => {
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#experimental-features" className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            Экспериментальная возможность
        </a>;
};

export const CloudNotSupportedBadge = () => {
  return <a href="https://clickhouse.com/docs/products/cloud/guides/cloud-compatibility#list-of-unsupported-features" className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            Не поддерживается в ClickHouse Cloud
        </a>;
};

По умолчанию в самоуправляемой версии ClickHouse используется сжатие `lz4`, а в ClickHouse Cloud — `zstd`.

Для таблиц семейства `MergeTree` метод сжатия по умолчанию можно изменить в разделе [compression](/docs/ru/reference/settings/server-settings/settings/other#compression) конфигурации сервера.

Метод сжатия также можно задать для каждого отдельного столбца в запросе [`CREATE TABLE`](/docs/ru/reference/statements/create/table).

```sql theme={null}
CREATE TABLE codec_example
(
    dt Date CODEC(ZSTD),
    ts DateTime CODEC(LZ4HC),
    float_value Float32 CODEC(NONE),
    double_value Float64 CODEC(LZ4HC(9)),
    value Float32 CODEC(Delta, ZSTD)
)
ENGINE = <Engine>
...
```

Кодек `Default` можно использовать для указания сжатия по умолчанию, которое во время выполнения может зависеть от различных настроек и свойств данных.
Пример: `value UInt64 CODEC(Default)` — то же, что не указывать кодек.
См. также [Адаптивный выбор кодека](#adaptive-codec-selection).

Также можно удалить текущий CODEC из столбца и использовать сжатие по умолчанию из config.xml:

```sql theme={null}
ALTER TABLE codec_example MODIFY COLUMN float_value CODEC(Default);
```

Кодеки можно объединять в конвейер, например: `CODEC(Delta, Default)`.

<Tip>
  Файлы базы данных ClickHouse нельзя распаковать с помощью внешних утилит, таких как `lz4`. Вместо этого используйте специальную утилиту [clickhouse-compressor](https://github.com/ClickHouse/ClickHouse/tree/master/programs/compressor).
</Tip>

Сжатие поддерживается следующими движками таблиц:

* Семейство [MergeTree](/docs/ru/reference/engines/table-engines/mergetree-family/mergetree). Поддерживает кодеки сжатия для столбцов и выбор метода сжатия по умолчанию в настройках [сжатия](/docs/ru/reference/settings/server-settings/settings/other#compression).
* Семейство [Log](/docs/ru/reference/engines/table-engines/log-family/index). По умолчанию использует метод сжатия `lz4` и поддерживает кодеки сжатия для столбцов.
* [Set](/docs/ru/reference/engines/table-engines/special/set). Поддерживается только сжатие по умолчанию.
* [Join](/docs/ru/reference/engines/table-engines/special/join). Поддерживается только сжатие по умолчанию.

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

<div id="general-purpose-codecs">
  ## Кодеки общего назначения
</div>

<div id="none">
  ### NONE
</div>

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

<div id="lz4">
  ### LZ4
</div>

`LZ4` — алгоритм [сжатия данных](https://github.com/lz4/lz4) без потерь, используемый по умолчанию. Использует быстрое сжатие LZ4.

<div id="lz4hc">
  ### LZ4HC
</div>

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

<div id="zstd">
  ### ZSTD
</div>

`ZSTD[(level)]` — [алгоритм сжатия ZSTD](https://en.wikipedia.org/wiki/Zstandard) с настраиваемым `level`. Допустимые уровни: \[1, 22]. Уровень по умолчанию: 1.

Высокие уровни сжатия полезны в асимметричных сценариях, например когда данные сжимаются один раз, а распаковываются многократно. Чем выше уровень, тем лучше сжатие и выше использование CPU.

<div id="zxc">
  ### ZXC
</div>

<ExperimentalBadge />

`ZXC[(level)]` — асимметричный [алгоритм сжатия `zxc`](https://github.com/hellobertrand/zxc) с настраиваемым `level`. Возможные уровни: \[1, 7]. Уровень по умолчанию: 3.

`ZXC` обеспечивает очень быструю распаковку ценой медленного сжатия, с коэффициентом сжатия между `LZ4` и `ZSTD`. Он хорошо подходит для сценария однократного сжатия и многократной распаковки и быстрее всего распаковывает данные на современных ядрах ARM. Более высокие уровни обеспечивают лучшее, но более медленное сжатие, при этом распаковка остаётся быстрой.

<Note>
  Этот кодек экспериментальный; для его использования требуется `SET allow_experimental_codecs = 1`.
</Note>

<div id="zstd_qat">
  ### Устарело: ZSTD\_QAT
</div>

<CloudNotSupportedBadge />

<div id="deflate_qpl">
  ### Устарело: DEFLATE\_QPL
</div>

<CloudNotSupportedBadge />

<div id="specialized-codecs">
  ## Специализированные кодеки
</div>

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

<div id="delta">
  ### Delta
</div>

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

<div id="doubledelta">
  ### DoubleDelta
</div>

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

<div id="gcd">
  ### GCD
</div>

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

<div id="gorilla">
  ### Gorilla
</div>

`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](https://doi.org/10.14778/2824032.2824078).

<div id="alp">
  ### ALP
</div>

<ExperimentalBadge />

`ALP(variant)` — адаптивное сжатие данных с плавающей запятой без потерь. Поддерживает `Float32` и `Float64`. Подробнее см. [ALP: Adaptive lossless floating-point compression](https://ir.cwi.nl/pub/33334).

Кодек принимает необязательный аргумент варианта:

* `ALP()` или `ALP(AUTO)` (по умолчанию) — использует STD и переходит к RD на основе оценки сжатого размера.
* `ALP(STD)` — стандартный вариант ALP. Представляет каждое значение в виде точного масштабированного целого числа с использованием десятичных степеней, а затем сжимает полученные целые числа методом Frame-of-Reference и битовой упаковкой. Непредставимые значения сохраняются как необработанные исключения. Лучше всего подходит для чисел, полученных из десятичных значений (например, измерений или цен).
* `ALP(RD)` — вариант Real Doubles. Переинтерпретирует битовый шаблон каждого значения и разделяет его на старшую часть (знак + экспонента + старшие биты мантиссы) и младшую часть. Старшие части кодируются словарём (до 8 элементов), младшие упаковываются по битам. Лучше всего подходит, когда у многих значений совпадают старшие биты.

<Note>
  Этот кодек экспериментальный; для его использования необходимо выполнить `SET allow_experimental_codecs = 1`.
</Note>

<div id="fpc">
  ### FPC
</div>

`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](https://userweb.cs.txstate.edu/~burtscher/papers/dcc07a.pdf).

<div id="sz3">
  ### SZ3
</div>

<ExperimentalBadge />

`SZ3` или `SZ3(algorithm, error_bound_mode, error_bound)` — кодек с потерями и ограничением ошибки ([SZ3 Lossy Compressor](https://szcompressor.org/)) для столбцов типов 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.

<Note>
  Этот кодек имеет экспериментальный статус; для его использования требуется `SET allow_experimental_codecs = 1`.
</Note>

<div id="t64">
  ### T64
</div>

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

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

```sql theme={null}
CREATE TABLE codec_example
(
    timestamp DateTime CODEC(DoubleDelta),
    slow_values Float32 CODEC(Gorilla)
)
ENGINE = MergeTree()
```

<div id="quantized">
  ### Квантованный
</div>

<ExperimentalBadge />

`Quantized(method, dimensions[, ...])` — специализированный кодек для приблизительного векторного поиска по столбцам типа `Array(Float32)`, `Array(Float64)` или `Array(BFloat16)`.
Он хранит исходные векторы с полной точностью, а также компактный *квантованный код* для каждого вектора.
В таблицах семейства `MergeTree` запросы векторного поиска с настройкой [`vector_search_use_quantized_codes`](/docs/ru/reference/settings/session-settings/vector-search#vector_search_use_quantized_codes) сканируют квантованные коды для формирования списка кандидатов, а затем повторно оценивают результаты по векторам с полной точностью.
Такой двухэтапный поиск считывает меньше байтов, чем обычное сканирование с полной точностью, но обеспечивает меньшую полноту результатов.
`dimensions` — длина вектора; поддерживаемые значения `method`: `rabitq`, `turboquant`, `int8`, `prefix` и `product`. Каждое из них предполагает свой компромисс между размером, точностью и функцией расстояния.

Кодек можно задать только в `CREATE TABLE`; его нельзя добавить, удалить или изменить с помощью `ALTER TABLE`, в том числе через `ADD COLUMN ... CODEC(Quantized(...))`.
Его нельзя объединять в цепочку с другим кодеком, даже с кодеком шифрования, например `AES_128_GCM_SIV`.
Подробнее см. в разделе [Векторный поиск с квантованными кодеками](/docs/ru/reference/engines/table-engines/mergetree-family/annindexes#vector-search-with-quantized-codecs).

```sql theme={null}
SET allow_experimental_codecs = 1;

CREATE TABLE vectors
(
    id UInt32,
    vec Array(BFloat16) CODEC(Quantized('rabitq', 1536))
)
ENGINE = MergeTree ORDER BY id;
```

<div id="encryption-codecs">
  ## Кодеки шифрования
</div>

Эти кодеки не сжимают данные, а шифруют их на диске. Они доступны только при указании ключа шифрования в настройках [encryption](/docs/ru/reference/settings/server-settings/settings/other#encryption). Обратите внимание: шифрование имеет смысл только в конце конвейера кодеков, поскольку зашифрованные данные обычно невозможно эффективно сжать.

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

<div id="aes_128_gcm_siv">
  ### AES\_128\_GCM\_SIV
</div>

`CODEC('AES-128-GCM-SIV')` — шифрует данные с помощью AES-128 в режиме GCM-SIV, описанном в [RFC 8452](https://tools.ietf.org/html/rfc8452).

<div id="aes-256-gcm-siv">
  ### AES-256-GCM-SIV
</div>

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

Эти кодеки используют фиксированный nonce, поэтому шифрование является детерминированным. Это обеспечивает совместимость с движками, поддерживающими дедупликацию, такими как [ReplicatedMergeTree](/docs/ru/reference/engines/table-engines/mergetree-family/replication), однако имеет недостаток: при повторном шифровании одного и того же блока данных результирующий шифротекст будет точно таким же. Поэтому злоумышленник, имеющий доступ к диску для чтения, сможет определить это совпадение (но не узнать содержимое данных).

<Note>
  Большинство движков, включая семейство "\*MergeTree", создают индексные файлы на диске без применения кодеков. Это означает, что открытый текст будет находиться на диске, если зашифрованный столбец индексирован.
</Note>

<Note>
  Если вы выполняете SELECT-запрос с указанием конкретного значения в зашифрованном столбце (например, в предложении WHERE), это значение может появиться в [system.query\_log](/docs/ru/reference/system-tables/query_log). Возможно, вам следует отключить логирование.
</Note>

**Пример**

```sql theme={null}
CREATE TABLE mytable
(
    x String CODEC(AES_128_GCM_SIV)
)
ENGINE = MergeTree ORDER BY x;
```

<Note>
  Если необходимо применить сжатие, его нужно указать явно. В противном случае к данным будет применено только шифрование.
</Note>

**Пример**

```sql theme={null}
CREATE TABLE mytable
(
    x String CODEC(Delta, LZ4, AES_128_GCM_SIV)
)
ENGINE = MergeTree ORDER BY x;
```

<div id="adaptive-codec-selection">
  ## Адаптивный выбор кодека
</div>

<ExperimentalBadge />

Описанные выше специализированные кодеки могут значительно уменьшить размер данных, однако их выбор требует опыта, и ни один из них не подходит для столбца, данные в котором меняются со временем. Если включена настройка MergeTree [`allow_experimental_adaptive_codec_selection`](/docs/ru/reference/settings/merge-tree-settings), ClickHouse сделает выбор за вас. Для столбцов, использующих кодек по умолчанию (`CODEC(Default)` или вовсе без `CODEC`), каждый блок записывается с кодеком, который обеспечивает наименьший размер, выбранным среди кодека таблицы по умолчанию, `NONE` и специализированных кодеков, подходящих для типа столбца.

Размер блока никогда не будет больше, чем при использовании кодека по умолчанию, а несжимаемые данные хранятся в исходном виде (их сжатие привело бы к созданию немного большего файла, который медленнее читается). Обработка выполняется в фоновом режиме — при слияниях и мутациях, когда данные в любом случае повторно сжимаются. Скорость вставки не меняется. Запросы часто выполняются быстрее: с диска считывается меньше данных, каждый блок, читаемый запросом, сначала необходимо распаковать, а специализированные кодеки распаковываются быстрее, чем стандартный `LZ4`. В каждом блоке сохраняется информация об использованном кодеке, поэтому для чтения не требуется никаких настроек, а эту возможность можно отключить в любой момент — все данные останутся доступными для чтения.

```sql theme={null}
CREATE TABLE adaptive
(
    time DateTime,
    user_id UInt64
)
ENGINE = MergeTree
ORDER BY time
SETTINGS allow_experimental_adaptive_codec_selection = 1;

INSERT INTO adaptive SELECT toDateTime('2026-01-01') + number, cityHash64(number) FROM numbers(1000000);
OPTIMIZE TABLE adaptive FINAL;
```

Работу этого механизма можно наблюдать с помощью табличной функции [`mergeTreeCodecBlockCounts`](/docs/ru/reference/functions/table-functions/mergeTreeCodecBlockCounts). Здесь значение `time` непрерывно возрастает, поэтому `T64`, который хранит только изменяющиеся в пределах блока биты, превзошёл кодек по умолчанию в каждом блоке. `user_id` содержит хеши, которые не удаётся сжать ни одному кодеку, поэтому его блоки хранились в исходном виде:

```sql theme={null}
SELECT column, codec_block_counts FROM mergeTreeCodecBlockCounts(currentDatabase(), 'adaptive');
```

```text theme={null}
   ┌─column──┬─codec_block_counts─┐
1. │ time    │ {'T64':62}         │
2. │ user_id │ {'NONE':123}       │
   └─────────┴────────────────────┘
```

В настоящее время выбор поддерживает следующие типы столбцов, близкие к целочисленным: целые числа, перечисления, даты и время, `Decimal32`/`Decimal64` и `IPv4`.

<div id="related-content">
  ## Связанные материалы
</div>

* Блог: [Оптимизация ClickHouse с помощью схем и кодеков](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema)
* Блог: [Работа с данными временных рядов в ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse)
