TwKit
正在载入
TwKit

GROUP BY 遇到上千万个分组时,大哈希表可能让 CPU 忙着等内存。 一种改法是基数分区,分两步: • 先给分组键算哈希,取高 12 位,把数据分进 … · @BaiBtw · TwKit

@BaiBtw

GROUP BY 遇到上千万个分组时,大哈希表可能让 CPU 忙着等内存。 一种改法是基数分区,分两步: • 先给分组键算哈希,取高 12 位,把数据分进 4096 个分区,同时保存哈希值。 • 再逐个分区建小哈希表、更新计数,复用已算好的哈希。例如 7、7、99、7 会得到 (7,3)、(99,1)。 这样多了一遍分区操作,却缩小了每次聚合的工作集,更容易命中 CPU 缓存。 一项单核实验对 9900 万行、约 1700 万个 UserID 做计数:数据已在页缓存时,耗时从 3.6 秒降到 2.7 秒;perf 的内存阻塞指标从 50.1% 降到 23.5%。执行的操作更多,等待反而更少。 这是特定硬件和数据上的结果。4096 不是通用最优值,也不能把后续多核版本的成绩,全算成分区这一项优化的收益。

曝光 206 · 评论 3 · 点赞 2 · 书签 0

查看原帖