GROUP BYは今なお高速化できるのか、PivotがTop-K集計で70%のパーティションを削減

Can GROUP BY still be optimized after all these years?

Pivotのエンジニアが、GROUP BYとORDER BY ... LIMITを組み合わせたTop-K集計クエリの新最適化を紹介。各パーティションに固定数の「スロット」を持たせ、全スロットの合計が現在のTop-Kの最小値より小さければパーティション全体のマージを省略する仕組みだ。ClickBenchのQ16では35.6msから22.2msへと1.6倍高速化し、70%以上のパーティションを枝刈りできたという。

もしそのパーティションの合計が小さければ、マージを完全にスキップできます。個々のグループがパーティション全体より多くの注文を持つことはあり得ないため、そのグループのどれも現在のTop-K結果に影響を与えられません。
  1. malisper

    いいね!他の人のために言うと、彼らが説明しているデータ構造はcount-min sketchだ。これを使ってgroup-byに入れる要素の上限を設定し、余計な作業をたくさんスキップしているようだ。

  2. ozgrakkurt

    彼らのclickbenchの結果は本当に良さそうだ。

    https://benchmark.clickhouse.com/#system=+liH|Hoaus|DcD|ucqs...

  3. toddbandrowsky

    いやあ、データセットをネットワーク越しに流すよりも、グループ化した結果だけを送る方が安く済むなんて、どうにも想像しにくいんだよな。そこが本当の問題なんだ。つまり、あるマシン上でgroup byするのに100nsかかるとして、そのデータがそこに届いて戻ってくるのに10倍かかるなら、誰が気にするんだって話だ。

    可能な限り最速のgroup byは、そのマシン上のシーケンシャルメモリ内で、NVMeから取得したデータに対して行うものだ。

    だから、group byパーティショニングを行うとき、私たちは実際にはグループ自体を別々のマシンに置き、そのgroup byをグループ化しようと言っているわけだ。それがとんでもない巨大データセットなら、置くべき場所はメインフレームで、それは基本的に馬鹿げた大きさのデータセットに対するgroup byのために作られたものだ。

この日のほかの記事

2026-11-07