ClickHouse 的内幕故事 (9) 如何进行聚合? – JackyWoo 的博客

主要观点:

  • Aggregation 是 ClickHouse 中最重要且最优化的操作符,本文分析其内部实现,包括宏观算法和底层数据结构,基于 ClickHouse v24.7。
  • 聚合算法由 HashMap、并行计算和两阶段聚合三要素组成,传统算法在预聚合程度低时性能有问题,可通过并行化最终聚合和使用 Two-level HashMap 优化。
  • ClickHouse 计算引擎是列式引擎,预聚合阶段从 Block 生成 HashMap,聚合函数状态对象在构建 HashMap 时分配内存,聚合操作可利用 SIMD 指令优化。
  • HashMap 是聚合操作符中最关键的数据结构,ClickHouse 针对不同聚合键类型实现了多种 HashMap 优化,如 FixedHashMap、StringHashMap、TwoLevelHashMap 等。
  • 还有其他优化,如按分区聚合、按顺序优化等。

关键信息:

  • 聚合算法要素:HashMap、并行计算、两阶段聚合。
  • 优化方法:并行化最终聚合、使用 Two-level HashMap、选择不同 HashMap 和哈希函数。
  • 数据结构:Block、HashMap(多种类型)。
  • 其他优化:按分区聚合、按顺序优化。

重要细节:

  • 传统算法在预聚合程度低时最终聚合处理时间长影响查询效率。
  • Two-level HashMap 是两层数据结构,可避免并发问题实现并行处理。
  • ClickHouse 计算引擎为列式引擎,Block 是二维表。
  • HashMap 采用开放寻址法,各类型 HashMap 有其特点和优势。
  • 聚合函数状态对象在构建 HashMap 时分配内存,可利用 SIMD 指令优化。
  • 有多种优化开关,如allow_aggregate_partitions_independentlyoptimize_aggregation_in_order等。
阅读 19
0 条评论