主要观点:
- 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_independently
、optimize_aggregation_in_order
等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。