メインコンテンツへスキップ
ClickHouse のクエリ性能を支える重要な要素の 1 つが圧縮です。 ディスク上のデータ量が少ないほど I/O は減り、クエリやインサートは高速になります。圧縮アルゴリズムによる CPU オーバーヘッドは、ほとんどの場合、I/O 削減による効果のほうが上回ります。そのため、ClickHouse のクエリを高速化したい場合、まず注力すべきなのはデータ圧縮の改善です。
ClickHouse がこれほど高い圧縮率を実現できる理由については、こちらの記事を読むことをお勧めします。要するに、ClickHouse のカラム指向データベースでは、値がカラム単位で書き込まれます。これらの値がソートされると、同じ値が隣接して配置されるため、圧縮アルゴリズムはデータ内の連続したパターンを効率よく活用できます。さらに、ClickHouse にはコーデックや粒度の細かいデータ型があり、圧縮をより細かく調整できます。
ClickHouse における圧縮は、主に次の 3 つの要因の影響を受けます。
  • ソートキー
  • データ型
  • 使用するコーデック
これらはすべてスキーマで設定します。

圧縮を最適化するために適切なデータ型を選択する

例として、Stack Overflow のデータセットを使います。posts テーブルについて、次のスキーマの圧縮統計を比較してみましょう。
  • posts - データ型の最適化を行っておらず、ソートキーもないスキーマ。
  • posts_v3 - 各カラムに適切なデータ型とビットサイズを使用し、ソートキー (PostTypeId, toDate(CreationDate), CommentCount) を持つ、データ型を最適化したスキーマ。
次のクエリを使うと、各カラムの現在の圧縮サイズと非圧縮サイズを測定できます。まずは、ソートキーのない初期スキーマ posts のサイズを見てみましょう。
compressed_size または uncompressed_size の値が 0 になっている場合、パーツのタイプが wide ではなく compact であることが原因の可能性があります (system.partspart_type の説明を参照) 。 パーツのフォーマットは、設定 min_bytes_for_wide_part および min_rows_for_wide_part によって制御されます。つまり、挿入された データから作成されるパーツが前述の設定値を超えない場合、そのパーツは wide ではなく compact になり、 compressed_sizeuncompressed_size の値は表示されません。以下で確認してみましょう。
クエリ
レスポンス
ここでは、圧縮サイズと非圧縮サイズの両方を示しています。どちらも重要です。圧縮サイズはディスクから読み取る必要がある量に相当し、クエリ性能 (およびストレージコスト) の観点から小さく抑えたい値です。このデータは読み取り前に展開する必要があります。一方、非圧縮サイズは、この場合は使用するデータ型に依存します。このサイズを小さくすると、クエリのメモリオーバーヘッドとクエリが処理しなければならないデータ量を減らせるため、cache の利用効率が向上し、最終的にはクエリ時間の改善につながります。
上記のクエリは、システムデータベース内の columns テーブルを利用しています。このデータベースは ClickHouse によって管理されており、クエリ性能のメトリクスからバックグラウンドのクラスター ログまで、有用な情報の宝庫です。さらに詳しく知りたい方には、“System Tables and a Window into the Internals of ClickHouse” と関連する記事[1][2] をおすすめします。
テーブル全体のサイズを要約するには、上記のクエリを次のように簡略化できます。
最適化されたデータ型とソートキーを持つテーブルposts_v3に対してこのクエリを繰り返すと、非圧縮サイズと圧縮サイズが大幅に減少していることがわかります。
詳細なカラム別の内訳を見ると、圧縮前にデータを並べ替え、適切な型を使用することで、BodyTitleTagsCreationDate の各カラムで大幅な削減が実現されていることがわかります。

適切なカラム圧縮コーデックの選び方

カラム圧縮コーデックを使うと、各カラムのエンコーディングと圧縮に使用するアルゴリズム (およびその設定) を変更できます。 エンコーディングと圧縮は、どちらもデータサイズを削減することを目的としていますが、仕組みは少し異なります。エンコーディングはデータ型の特性を利用し、関数に基づいて値を変換するマッピングをデータに適用します。一方、圧縮は汎用的なアルゴリズムによって、バイトレベルでデータを圧縮します。 通常は、まずエンコーディングを適用し、その後に圧縮を行います。どのエンコーディング方式や圧縮アルゴリズムが有効かは値の分布によって異なるため、データの特性を理解しておく必要があります。 ClickHouse は多数のコーデックと圧縮アルゴリズムをサポートしています。以下は、重要度の高い順に並べた推奨事項です。 さらに選択肢については、こちらを参照してください。 以下では、IdViewCountAnswerCountDelta コーデックを指定しています。これらはソートキーと線形に相関していると仮定しており、そのため Delta エンコーディングの恩恵を受けるはずです。
これらのカラムの圧縮改善効果を以下に示します:

ClickHouse Cloud における圧縮

ClickHouse Cloud では、デフォルトで ZSTD 圧縮アルゴリズム (デフォルト値は 1) を使用しています。このアルゴリズムの圧縮速度は圧縮レベルによって変動し (レベルが高いほど遅くなります) 、ばらつきはあるものの、展開時は常に高速であること (変動幅はおよそ 20%) に加え、並列化できるという利点もあります。これまでのテストからも、このアルゴリズムは多くの場合に十分な効果を発揮し、codec と組み合わせた LZ4 を上回ることさえあると示されています。ほとんどのデータ型やデータ分布で効果的であるため、汎用的なデフォルトとして妥当であり、最適化を行わなくても初期状態の圧縮性能がすでに優れている理由でもあります。
最終更新日 2026年7月2日