lz4 圧縮を使用し、ClickHouse Cloud では zstd を使用します。
MergeTree エンジンファミリーでは、サーバー設定の compression セクションでデフォルトの圧縮方式を変更できます。
各カラムの圧縮方式は、CREATE TABLE ステートメントで個別に定義することもできます。
Default コーデックを指定すると、実行時の各種設定 (およびデータのプロパティ) に応じたデフォルトの圧縮を参照できます。
例: value UInt64 CODEC(Default) — コーデックを指定しない場合と同じです。
適応型コーデック選択も参照してください。
また、カラムから現在のCODECを削除し、config.xmlで指定されたデフォルトの圧縮を使用することもできます。
CODEC(Delta, Default)。
圧縮は、以下のテーブルエンジンでサポートされています。
- MergeTree ファミリー。カラム圧縮コーデックと、compression 設定でデフォルトの圧縮方式を選択する機能をサポートします。
- Log ファミリー。デフォルトでは
lz4圧縮方式を使用し、カラム圧縮コーデックをサポートします。 - Set。デフォルトの圧縮のみをサポートします。
- Join。デフォルトの圧縮のみをサポートします。
汎用コーデック
NONE
NONE — 圧縮なし。
LZ4
LZ4 — デフォルトで使用される可逆データ圧縮アルゴリズムです。LZ4 の高速圧縮を使用します。
LZ4HC
LZ4HC[(level)] — レベルを設定可能な LZ4 HC (高圧縮) アルゴリズム。デフォルトレベルは 9 です。level <= 0 を指定すると、デフォルトレベルが適用されます。指定可能なレベル: [1, 12]。推奨レベル範囲: [4, 9]。
ZSTD
ZSTD[(level)] — levelを指定可能なZSTD圧縮アルゴリズム。指定可能なレベル: [1, 22]。デフォルトのレベル: 1。
高い圧縮レベルは、1回圧縮して何度も展開するような非対称なシナリオで有用です。レベルが高いほど圧縮率は向上しますが、CPU使用率も高くなります。
ZXC
ZXC[(level)] — level を設定可能な非対称 zxc 圧縮アルゴリズム。指定可能なレベル: [1, 7]。デフォルトレベル: 3。
ZXC は、圧縮速度を犠牲にする代わりに非常に高速な展開を実現し、圧縮率は LZ4 と ZSTD の中間です。一度圧縮して何度も展開するパターンに適しており、最新の ARM コアでは最も高速に展開されます。レベルを上げるほど圧縮率は向上し、圧縮速度は低下しますが、展開は高速なままです。
このコーデックは実験的機能であり、使用するには
SET allow_experimental_codecs = 1 が必要です。廃止された: ZSTD_QAT
廃止された: DEFLATE_QPL
特殊用途のコーデック
Delta
Delta(delta_bytes) — 最初の値を除き、生データの値を隣接する2つの値の差に置き換える圧縮方式です。最初の値はそのまま保持されます。delta_bytes は生データの値の最大サイズで、デフォルト値は sizeof(type) です。引数としての delta_bytes の指定は非推奨であり、今後のリリースでサポートが削除される予定です。Delta はデータ準備コーデックであるため、単独では使用できません。
DoubleDelta
DoubleDelta(bytes_size) — デルタの差を計算し、コンパクトなバイナリ形式で書き込みます。bytes_size は、Delta コーデック の delta_bytes と同様の意味を持ちます。引数としての bytes_size の指定は非推奨であり、今後のリリースでサポートが削除されます。時系列データのように stride が一定の単調な数列では、最適な圧縮率が得られます。任意の数値型で使用できます。Gorilla TSDB で使用されるアルゴリズムを実装し、64 ビット型をサポートするように拡張しています。32 ビットのデルタでは追加で 1 ビットを使用し、4 ビットのプレフィックスではなく 5 ビットのプレフィックスを使用します。詳細については、Gorilla: A Fast, Scalable, In-Memory Time Series Database の「Compressing Time Stamps」を参照してください。DoubleDelta はデータ準備 コーデック であるため、単独では使用できません。
GCD
GCD() - - カラム内の値の最大公約数 (GCD) を計算し、各値をGCDで除算します。整数、小数、日付/時刻のカラムで使用できます。このコーデックは、24、28、16、24、8、24 (GCD = 4) のように、値がGCDの倍数ずつ増減するカラムに適しています。GCDはデータ準備コーデックであるため、単独では使用できません。
Gorilla
Gorilla(bytes_size) — 現在と直前の浮動小数点値の XOR を計算し、compact なバイナリ形式で書き込みます。連続する値の差が小さいほど、つまり時系列の値の変化が緩やかなほど、圧縮率が向上します。Gorilla TSDB で使用されているアルゴリズムを実装し、64 ビット型をサポートするよう拡張しています。bytes_size に指定できる値は 1、2、4、8 です。デフォルト値は、sizeof(type) が 1、2、4、8 のいずれかであればその値、それ以外の場合は 1 です。詳細については、Gorilla: A Fast, Scalable, In-Memory Time Series Database のセクション 4.1 を参照してください。
ALP
ALP(variant) — 浮動小数点データ向けの適応型可逆圧縮です。Float32 と Float64 をサポートします。詳細については、ALP: Adaptive lossless floating-point compressionを参照してください。
このコーデックは省略可能なバリアント引数を受け取ります。
ALP()またはALP(AUTO)(デフォルト) — 推定圧縮サイズに基づいて STD を使用し、必要に応じて RD にフォールバックします。ALP(STD)— 標準の ALP バリアント。各値を 10 のべき乗でスケーリングした正確な整数として表現し、得られた整数を Frame-of-Reference とビットパッキングで圧縮します。表現できない値は生データの例外として保存されます。小数値に由来する数値 (例: 測定値、価格) に最適です。ALP(RD)— Real Doubles バリアント。各値のビットパターンを再解釈し、高位部分 (符号 + 指数 + 仮数の上位ビット) と低位部分に分割します。高位部分は Dictionary エンコード (最大 8 エントリ) され、低位部分はビットパッキングされます。多くの値で上位ビットが共通している場合に最適です。
このコーデックは実験的機能であり、使用するには
SET allow_experimental_codecs = 1 が必要です。FPC
FPC(level, float_size) - 数列内の次の浮動小数点値を、2 つの予測器のうち精度の高い方を使って繰り返し予測し、実際の値と予測値の 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) - Float32、Float64、Array(Float32)、または Array(Float64) 型のカラムに対応する、誤差上限を指定できる非可逆 コーデック (SZ3 Lossy Compressor) です。配列カラムでは、すべての配列の長さが同じ場合に最も効果的に圧縮されます (この場合、固定幅ベクトルとして圧縮されます) 。長さが異なる配列もサポートされますが、値のフラットな数列として圧縮されます。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 コーデック で効率的に圧縮されます。たとえば、効率的に保存できる テーブル を作成するには、次の configuration を使用します。
Quantized
Quantized(method, dimensions[, ...]) — Array(Float32)、Array(Float64)、または Array(BFloat16) 型のカラムで近似ベクトル検索をサポートする専用コーデックです。
元のフル精度ベクトルに加えて、各ベクトルに対応するコンパクトな量子化コードも保存します。
MergeTree ファミリーのテーブルでは、設定 vector_search_use_quantized_codes を使用するベクトル検索クエリは、量子化コードをスキャンしてショートリストを作成した後、フル精度ベクトルに対して結果を再スコアリングします。
この2段階検索では、再現率は低下しますが、通常のフル精度スキャンよりも読み取りバイト数を削減できます。
dimensions はベクトル長を表します。サポートされる method の値は rabitq、turboquant、int8、prefix、product で、それぞれサイズ、精度、距離関数の間で異なるトレードオフがあります。
このコーデックは CREATE TABLE でのみ設定でき、ADD COLUMN ... CODEC(Quantized(...)) を含め、ALTER TABLE で追加、削除、変更することはできません。
暗号化コーデックの AES_128_GCM_SIV を含め、他のコーデックと連結することはできません。
詳細については、量子化コーデックを使用したベクトル検索 を参照してください。
暗号化コーデック
AES_128_GCM_SIV
CODEC('AES-128-GCM-SIV') — RFC 8452 のGCM-SIVモードでAES-128を使用し、データを暗号化します。
AES-256-GCM-SIV
CODEC('AES-256-GCM-SIV') — AES-256 を GCM-SIV モードで使用してデータを暗号化します。
これらのコーデックは固定 nonce を使用するため、暗号化は決定論的です。そのため、ReplicatedMergeTree などの重複排除機能を持つエンジンと互換性がありますが、弱点もあります。同じデータブロックを 2 回暗号化すると、生成される暗号文は完全に同一になります。そのため、ディスクを読み取れる攻撃者は同一性を確認できます (ただし、内容は取得できません) 。
“*MergeTree” ファミリーを含むほとんどのエンジンは、コーデックを適用せずにディスク上に索引ファイルを作成します。つまり、暗号化されたカラムに索引が作成されている場合、平文がディスク上に残ります。
暗号化されたカラム内の特定の値を指定する SELECT クエリ (WHERE 句など) を実行すると、その値が system.query_log に記録される場合があります。ロギングを無効にすることを検討してください。
圧縮が必要な場合は、明示的に指定する必要があります。指定しない場合、データには暗号化のみが適用されます。
適応型コーデック選択
allow_experimental_adaptive_codec_selection を有効にすると、ClickHouse が自動的に選択します。デフォルトのコーデック (CODEC(Default) または CODEC の指定なし) を使用するカラムでは、各ブロックはテーブル’のデフォルトコーデック、NONE、およびカラム型に適した特殊用途のコーデックの中から、最も小さく圧縮できるコーデックで書き込まれます。
ブロックがデフォルトコーデック使用時より大きくなることはなく、圧縮できないデータは生データとして保存されます (圧縮するとファイルがわずかに大きくなり、読み取りも遅くなるためです) 。この処理は、いずれにしてもデータが再圧縮される、バックグラウンドでのマージとミューテーション時に行われます。挿入速度には影響しません。ディスクから取得するデータ量が減り、クエリで読み取るすべてのブロックはまず展開する必要があり、特殊なコーデックはデフォルトの LZ4 より高速に展開できるため、クエリは多くの場合高速になります。各ブロックには書き込み時に使用したコーデックが記録されるため、読み取り時に設定は不要です。また、すべてのデータを読み取り可能なまま、いつでもこの機能を無効にできます。
mergeTreeCodecBlockCounts テーブル関数を使用すると、その仕組みを確認できます。ここでは time が一定に増加するため、ブロック内で変化するビットのみを保存する T64 は、すべてのブロックでデフォルトの コーデック よりも優れた結果を示しました。user_id にはどの コーデック でも圧縮できない hash が格納されているため、そのブロックは生データのまま保存されました:
Decimal32/Decimal64、IPv4などの整数系カラムです。