データ基盤

ClickHouseとは|読む量は12倍違うのに、手元に載る規模では時間差が1.1倍だった

何を変えている仕組みなのか読む量はどれだけ減るのか時間はいつ縮むのか

12項目のうち1項目だけを集計しました。読む量は9.2MBと0.8MBで12.0倍の差です。

ところが手元に載る規模では、時間の差は1.1倍しかありませんでした。量の比はそのまま時間になりません。

この記事の要点

  • 1項目なら12.0倍
  • 3項目なら4.0倍
  • 12項目なら1.0倍
  • この規模の時間差は1.1倍

並べ方だけが違い、持っている値は同じ

行の連なりとして持つか、列の集まりとして持つか。中身は変わりません。

ClickHouseが変えているのは、値の並べ方です。まず比較の相手が説明されています。

行を単位に並べるデータベースでは、連続する表の行が、次々と順に保管されるという記述です。1行ぶんの全項目が固まって置かれます。

ClickHouseは逆です。同じ列の値が、次々と並びます。

何が変わるか

  1. 使う列だけ読める。ほかの列を飛ばせる
  2. 同じ種類の値が並ぶ。まとめて縮めやすい
  3. 1行を取り出すのが遠回り。項目の数だけ場所を訪ねる
  4. 1行を足すのが遠回り。列の数だけ書きに行く

1番目が本題です。どれだけ飛ばせるかは、使う項目の数で決まります。

向いている問い合わせ

出典は用途の違いにも触れています。1回の問い合わせで数行だけを読み書きする形と、億や兆の行を処理する形は別だという整理です。

後者では、触る項目の数が全体の項目数よりずっと少ないのが普通です。だから飛ばせる分が大きくなります。

出典ClickHouse 公式ドキュメント「What is ClickHouse?」2026-08-18 確認
In a row-oriented database, consecutive table rows are sequentially stored one after the other.
原文ClickHouse 公式ドキュメント「What is ClickHouse?」 この内容の有効期限2027-02-18

読む量は12倍違うのに、手元に載る規模では時間差が1.1倍だった

量の比はそのまま時間になりません。差が出るのは、量が手元に載らなくなってからです。

ClickHouseの利点として挙げられているのは、読み込む量です。出典は行を単位に並べた場合をこう説明しています。

行を単位に並べるデータベースでは、上の問い合わせが既存の列のうちわずかしか処理しないにもかかわらず、系は他の列のデータも保管先から手元へ読み込む必要があるという記述です。

その量の差と、実際の時間の差を分けて測りました。

使う項目の数を変える

text
表 200,000行・1行あたり 12項目(1項目 4バイト)
集計に使う項目の数を変えて、読む量を見る

使う項目  行ごとに持つ形  列ごとに持つ形  比
1個                   9.2MB           0.8MB   12.0倍
2個                   9.2MB           1.5MB    6.0倍
3個                   9.2MB           2.3MB    4.0倍
6個                   9.2MB           4.6MB    2.0倍
12個                  9.2MB           9.2MB    1.0倍

1項目だけを合計する時間(同じ値になることを確認済み)
  行ごとに持つ形  0.22ms
  列ごとに持つ形  0.20ms(1.1倍速い)

読む量の比は使う項目の数で決まります。1項目なら12.0倍、6項目なら2.0倍です。

ところが下の実測では、時間差は1.1倍でした。12倍の量の差が、時間には出ていません。

時間差が出る条件

この規模では、飛ばしたはずの項目も一緒に手元へ載っています。読み込みそのものが起きていません。

差が出るのは、手元に載りきらない量になってからです。そこで初めて、読む量の比がそのまま時間に現れます。

つまり小さい表では並べ方を変えても効きません。効いてくる規模かどうかを先に確かめることになります。

量の比は使う項目の数で決まり、時間の比は規模で決まる。

行ごとに持つ形との比(倍)集計に使う項目(個)→13.213.21項目2項目3項目6項目12項目20万行・12項目での計算。使う項目が全項目に近づくと比は1.0倍になり、利点が消える。
図1 ── 使う項目の数と、読む量の比
出典ClickHouse 公式ドキュメント「What is ClickHouse?」2026-08-18 確認
In a row-oriented database, even though the query above only processes a few out of the existing columns, the system still needs to load the data from other existing columns from disk to memory.
原文ClickHouse 公式ドキュメント「What is ClickHouse?」 この内容の有効期限2027-02-18

1行を丸ごと扱う用途では、関係が逆になる

列ごとに並んでいるので、1行の全項目を集めるには項目の数だけ場所を訪ねます。

ClickHouseで無駄が出ない理由は、並びにあります。出典は各列の値が保管先の上で次々と順に置かれているため、上の問い合わせを実行するときに不要なデータは読み込まれないと説明しています。

この性質は、逆向きの用途では不利になります。1行の全項目は、12箇所に散っています

向かない使い方

  1. 1件の詳細を表示する。12項目ぶん訪ねる
  2. 1件ずつ足していく。列の数だけ書きに行く
  3. 1件だけ書き換える。並びを保つ作業が要る
  4. その場で消す。同じ理由で重い

前の計測の12項目の行がこの場合にあたります。比は1.0倍で、利点がなくなります。

実際には1.0倍より悪くなります。12箇所を訪ねる手間が加わるためです。

使い分けの決め方

同じデータを両方の形で持つのが実際的です。取引の記録は行ごと、集計は列ごとという分け方になります。

その場合、片方からもう片方へ流す工程が要ります。その作り方はETLの記事で扱っています。

分けたぶん、置き場所は2つになります。読む量が12分の1になっても、保管する量は2倍という形です。

余談 この計測での注意

実在のデータベースは使わず、2つの並べ方をその場で作って測っています。読む量は項目の数からの計算で、実際の系ではまとめて縮める処理が入るため、列ごとに持つ側はさらに小さくなります。1項目4バイトという値も置いたものです。時間の実測が1.1倍にとどまったのはこの規模だからで、より大きな量では読む量の比に近づきます。ここで見せているのは、量の比と時間の比が別物だという関係です。

出典ClickHouse 公式ドキュメント「What is ClickHouse?」2026-08-18 確認
Because the values of each column are stored sequentially one after the other on disk, no unnecessary data is loaded when the query from above is run.
原文ClickHouse 公式ドキュメント「What is ClickHouse?」 この内容の有効期限2027-02-18

よくある質問

ClickHouseは何が違いますか
並べ方です。表を行の連なりではなく、列の集まりとして保管します。
読む量はどれだけ減りますか
使う項目の数によります。12項目のうち1項目なら12.0倍、3項目なら4.0倍でした。
時間もその比で速くなりますか
なりません。この計測では手元に載る規模だったため、時間差は1.1倍にとどまりました。
向かない問い合わせはありますか
1行の全項目を取り出す形です。その場合は関係が逆になり、行ごとに持つほうが有利です。

まとめ

  • 列ごとに並べて持つ
  • 使う列だけ読める
  • 量の比は時間の比ではない
  • 1行取り出しには向かない

今日から始められること

  1. よく使う集計が何項目を触るか数える
  2. 表の項目数と比べて比を出す
  3. 扱うデータが手元に載る規模か確かめる
  4. 1行を丸ごと取り出す用途がないか見る

実務で組んだClickHouseのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る