現代のCPUは、ナノ秒あたり4回から8回の演算を実行するなど、極めて高速なスピードで命令を処理する能力を持っています。対照的に、システムRAM(DRAM)からデータにアクセスする速度は大幅に遅く、50ナノ秒から100ナノ秒を要します。この格差は、CPUがRAMからのメモリアクセス1回につき、理論上400から800の命令を実行できることを意味します。これを緩和するために、プロセッサはコアに物理的に近く、DRAMよりもはるかに高速なキャッシュの階層(L1、L2、L3)を使用しています。しかし、これらのキャッシュは比較的サイズが小さく、L1キャッシュは通常64KB程度です。そのため、頻繁にアクセスされるデータがこれらの高速な階層に留まるように、ソフトウェアを「キャッシュ親和性(cache sympathy)」を考慮して設計する必要があります。

大規模なデータセットに対して`GROUP BY`集計を実行する場合、ナイーブな実装では、すべてのユニークなグループキーを保存するために単一の巨大なハッシュテーブルを使用することがあります。ユニークなキーの数が多いために、ハッシュテーブルのサイズがCPUのキャッシュサイズを超えてしまうことがあります。これにより、CPUはほぼすべての操作においてDRAMへの「コールド」なメモリアクセスを強制されます。システムモニターでCPUの使用率が100%と表示されていても、プロセッサは実際には命令を実行するのではなく、メモリからデータが到着するのを待つ「ストール」状態に大部分の時間を費やしている可能性があります。9,900万行のデータセットを使用したテストでは、ナイーブなアプローチではCPUがメモリ待ちで50%以上の時間を費やしており、実際に操作を完了(リタイア)させていたのは約16%に過ぎませんでした。

これを最適化するために、開発者はラディックス・パーティショニング(radix partitioning)と呼ばれる手法を使用できます。これは、キーのハッシュに基づいてデータを固定数の小さなパーティション(例:4,096)に分割する手法です。これらの小さなパーティションを一つずつ処理することで、対応するハッシュテーブルがCPUのキャッシュ内に完全に収まる可能性が非常に高くなります。この手法は、集計前にデータをパーティションに移動させる必要があるため、技術的には合計の操作数が増えますが、そのトレードオフは非常に有益です。同じテストにおいて、ラディックス・パーティショニングに切り替えたことで、メモリのストール時間は50.1%から23.5%に減少し、DRAMから引き出されるデータ量は60%減少しました。これは、それらの命令が低速なメモリ待ちに置き換わるのであれば、総命令数を増やすことが多くの場合において勝利の戦略になることを示しています。