ClickHouse がこれほど高い圧縮率を実現できる理由については、こちらの記事を読むことをお勧めします。要するに、ClickHouse のカラム指向データベースでは、値がカラム単位で書き込まれます。これらの値がソートされると、同じ値が隣接して配置されるため、圧縮アルゴリズムはデータ内の連続したパターンを効率よく活用できます。さらに、ClickHouse にはコーデックや粒度の細かいデータ型があり、圧縮をより細かく調整できます。ClickHouse における圧縮は、主に次の 3 つの要因の影響を受けます。
- ソートキー
- データ型
- 使用するコーデック
圧縮を最適化するために適切なデータ型を選択する
posts テーブルについて、次のスキーマの圧縮統計を比較してみましょう。
posts- データ型の最適化を行っておらず、ソートキーもないスキーマ。posts_v3- 各カラムに適切なデータ型とビットサイズを使用し、ソートキー(PostTypeId, toDate(CreationDate), CommentCount)を持つ、データ型を最適化したスキーマ。
posts のサイズを見てみましょう。
compact パーツと wide パーツについて
compact パーツと wide パーツについて
compressed_size または uncompressed_size の値が 0 になっている場合、パーツのタイプが wide ではなく compact であることが原因の可能性があります (system.parts の part_type の説明を参照) 。
パーツのフォーマットは、設定 min_bytes_for_wide_part
および min_rows_for_wide_part によって制御されます。つまり、挿入された
データから作成されるパーツが前述の設定値を超えない場合、そのパーツは wide ではなく compact になり、
compressed_size や uncompressed_size の値は表示されません。以下で確認してみましょう。クエリ
レスポンス
上記のクエリは、システムデータベース内の columns テーブルを利用しています。このデータベースは ClickHouse によって管理されており、クエリ性能のメトリクスからバックグラウンドのクラスター ログまで、有用な情報の宝庫です。さらに詳しく知りたい方には、“System Tables and a Window into the Internals of ClickHouse” と関連する記事[1][2] をおすすめします。
テーブル全体のサイズを要約するには、上記のクエリを次のように簡略化できます。
posts_v3に対してこのクエリを繰り返すと、非圧縮サイズと圧縮サイズが大幅に減少していることがわかります。
Body、Title、Tags、CreationDate の各カラムで大幅な削減が実現されていることがわかります。
適切なカラム圧縮コーデックの選び方
さらに選択肢については、こちらを参照してください。
以下では、
Id、ViewCount、AnswerCount に Delta コーデックを指定しています。これらはソートキーと線形に相関していると仮定しており、そのため Delta エンコーディングの恩恵を受けるはずです。
ClickHouse Cloud における圧縮
ZSTD 圧縮アルゴリズム (デフォルト値は 1) を使用しています。このアルゴリズムの圧縮速度は圧縮レベルによって変動し (レベルが高いほど遅くなります) 、ばらつきはあるものの、展開時は常に高速であること (変動幅はおよそ 20%) に加え、並列化できるという利点もあります。これまでのテストからも、このアルゴリズムは多くの場合に十分な効果を発揮し、codec と組み合わせた LZ4 を上回ることさえあると示されています。ほとんどのデータ型やデータ分布で効果的であるため、汎用的なデフォルトとして妥当であり、最適化を行わなくても初期状態の圧縮性能がすでに優れている理由でもあります。