交互式分析领域,为何 ClickHouse 能够杀出重围?( 三 )


相比于传统火山模型中的逐行处理模式 , 向量化执行引擎采用批量处理模式 , 可以大幅减少函数调用开销 , 降低指令、数据的 Cache Miss , 提升 CPU 利用效率 。 并且 ClickHouse 可利用 SIMD 指令进一步加速执行效率 。 这部分是 ClickHouse 优于大量同类 OLAP 产品的重要因素 。
以商品订单数据为例 , 查询某个订单总价格的处理过程 , 由传统的按行遍历处理的过程 , 转换为按 Block 处理的过程 , 具体如下图:
交互式分析领域,为何 ClickHouse 能够杀出重围?文章插图
3. 编码压缩由于 ClickHouse 采用列存储 , 相同列的数据连续存储 , 且底层数据在存储时是经过排序的 , 这样数据的局部规律性非常强 , 有利于获得更高的数据压缩比 。
此外 , ClickHouse 除了支持 LZ4、ZSTD 等通用压缩算法外 , 还支持 Delta、DoubleDelta、Gorilla 等专用编码算法 [4], 用于进一步提高数据压缩比 。
其中 DoubleDelta、Gorilla 是 Facebook 专为时间序数据而设计的编码算法 , 理论上在列存储环境下 , 可接近专用时序存储的压缩比 , 详细可参考 Gorilla 论文 [5]。
交互式分析领域,为何 ClickHouse 能够杀出重围?文章插图
在实际场景下 , ClickHouse 通常可以达到 10 : 1 的压缩比 , 大幅降低存储成本 。 同时 , 超高的压缩比又可以降低存储读取开销、提升系统缓存能力 , 从而提高查询性能 。
4. 多索引列存用于裁剪不必要的字段读取 , 而索引则用于裁剪不必要的记录读取 。 ClickHouse 支持丰富的索引 , 从而在查询时尽可能的裁剪不必要的记录读取 , 提高查询性能 。
ClickHouse 中最基础的索引是主键索引 。 前面我们在物理存储模型中介绍 , ClickHouse 的底层数据按建表时指定的 ORDER BY 列进行排序 , 并按 index_granularity 参数切分成数据块 , 然后抽取每个数据块的第一行形成一份稀疏的排序索引 。
用户在查询时 , 如果查询条件包含主键列 , 则可以基于稀疏索引进行快速的裁剪 。 这里通过下面的样例数据及对应的主键索引进行说明:
交互式分析领域,为何 ClickHouse 能够杀出重围?文章插图
样例中的主键列为 CounterID、Date , 这里按每 7 个值作为一个数据块 , 抽取生成了主键索引 Marks 部分 。 当用户查询 CounterID equal ‘h’ 的数据时 , 根据索引信息 , 只需要读取 Mark number 为 6 和 7 的两个数据块 。
ClickHouse 支持更多其他的索引类型 , 不同索引用于不同场景下的查询裁剪 , 具体汇总如下 , 更详细的介绍参考 ClickHouse 官方文档 [6] :
交互式分析领域,为何 ClickHouse 能够杀出重围?文章插图
5. 物化视图(Cube/Rollup)OLAP 分析领域有两个典型的方向:一是 ROLAP , 通过列存、索引等各类技术手段 , 提升查询时性能 。
另一是 MOLAP , 通过预计算提前生成聚合后的结果数据 , 降低查询读取的数据量 , 属于计算换性能方式 。
前者更为灵活 , 但需要的技术栈相对复杂;后者实现相对简单 , 但要达到的极致性能 , 需要生成所有常见查询对应的物化视图 , 消耗大量计算、存储资源 。 物化视图的原理如下图所示 , 可以在不同维度上对原始数据进行预计算汇总:
交互式分析领域,为何 ClickHouse 能够杀出重围?文章插图
ClickHouse 一定程度上做了两者的结合 , 在尽可能采用 ROLAP 方式提高性能的同时 , 支持一定的 MOLAP 能力 , 具体实现方式为 MergeTree系列表引擎 [7] 和 MATERIALIZED VIEW [8]。
事实上 , Yandex.Metrica 的存储系统也经历过使用纯粹 MOLAP 方案的发展过程 , 具体参考 ClickHouse的发展历史 [9]。
用户在使用时 , 可优先按照 ROLAP 思路进行调优 , 例如主键选择、索引优化、编码压缩等 。 当希望性能更高时 , 可考虑结合 MOLAP 方式 , 针对高频查询模式 , 建立少量的物化视图 , 消耗可接受的计算、存储资源 , 进一步换取查询性能 。
6. 其他特性除了前面所述 , ClickHouse 还有非常多其他特性 , 抽取列举如下 , 更多详细内容可参考 ClickHouse官方文档 [10]。