12項目のうち1項目だけを集計しました。読む量は9.2MBと0.8MBで12.0倍の差です。
ところが手元に載る規模では、時間の差は1.1倍しかありませんでした。量の比はそのまま時間になりません。
行の連なりとして持つか、列の集まりとして持つか。中身は変わりません。
ClickHouseが変えているのは、値の並べ方です。まず比較の相手が説明されています。
行を単位に並べるデータベースでは、連続する表の行が、次々と順に保管されるという記述です。1行ぶんの全項目が固まって置かれます。
ClickHouseは逆です。同じ列の値が、次々と並びます。
1番目が本題です。どれだけ飛ばせるかは、使う項目の数で決まります。
出典は用途の違いにも触れています。1回の問い合わせで数行だけを読み書きする形と、億や兆の行を処理する形は別だという整理です。
後者では、触る項目の数が全体の項目数よりずっと少ないのが普通です。だから飛ばせる分が大きくなります。
In a row-oriented database, consecutive table rows are sequentially stored one after the other.原文ClickHouse 公式ドキュメント「What is ClickHouse?」 この内容の有効期限2027-02-18
量の比はそのまま時間になりません。差が出るのは、量が手元に載らなくなってからです。
ClickHouseの利点として挙げられているのは、読み込む量です。出典は行を単位に並べた場合をこう説明しています。
行を単位に並べるデータベースでは、上の問い合わせが既存の列のうちわずかしか処理しないにもかかわらず、系は他の列のデータも保管先から手元へ読み込む必要があるという記述です。
その量の差と、実際の時間の差を分けて測りました。
表 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倍の量の差が、時間には出ていません。
この規模では、飛ばしたはずの項目も一緒に手元へ載っています。読み込みそのものが起きていません。
差が出るのは、手元に載りきらない量になってからです。そこで初めて、読む量の比がそのまま時間に現れます。
つまり小さい表では並べ方を変えても効きません。効いてくる規模かどうかを先に確かめることになります。
量の比は使う項目の数で決まり、時間の比は規模で決まる。
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行の全項目を集めるには項目の数だけ場所を訪ねます。
ClickHouseで無駄が出ない理由は、並びにあります。出典は各列の値が保管先の上で次々と順に置かれているため、上の問い合わせを実行するときに不要なデータは読み込まれないと説明しています。
この性質は、逆向きの用途では不利になります。1行の全項目は、12箇所に散っています。
前の計測の12項目の行がこの場合にあたります。比は1.0倍で、利点がなくなります。
実際には1.0倍より悪くなります。12箇所を訪ねる手間が加わるためです。
同じデータを両方の形で持つのが実際的です。取引の記録は行ごと、集計は列ごとという分け方になります。
その場合、片方からもう片方へ流す工程が要ります。その作り方はETLの記事で扱っています。
分けたぶん、置き場所は2つになります。読む量が12分の1になっても、保管する量は2倍という形です。
実在のデータベースは使わず、2つの並べ方をその場で作って測っています。読む量は項目の数からの計算で、実際の系ではまとめて縮める処理が入るため、列ごとに持つ側はさらに小さくなります。1項目4バイトという値も置いたものです。時間の実測が1.1倍にとどまったのはこの規模だからで、より大きな量では読む量の比に近づきます。ここで見せているのは、量の比と時間の比が別物だという関係です。
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
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る