ClickHouse入门、实战与进阶
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.8 运行时代码生成

ClickHouse实现高性能查询的技术里,除了分布式MPP、数据压缩、SIMD向量化查询执行等,还有运行时代码生成技术。在查询执行过程中,动态生成运行时代码,消除了间接分派(Indirection Dispatch)和动态分派(Dynamic Dispatch)带来的性能损耗,可以更好地将多个操作融合在一起,从而充分利用CPU执行单元和流水线。

经典的数据库实现通常使用火山模型进行表达式计算,即将查询转化为一个算子,如hashjoin、scan、indexscan、aggregation等。为了连接不同的算子,算子采用统一的API,如open()、next()、close()函数等。在分析场景中一条SQL语句通常需要处理数亿行数据,此时虚函数的调用成本很高。另外,每个算子都要考虑多种变量,如列类型、列大小、列数等,if-else分支判断的数量较多,进而导致CPU分支预测失败。

ClickHouse实现了在运行时根据当前SQL动态生成代码,然后编译执行。这样不仅消除了大量的虚函数调用,而且消除了由于参数类型造成的不必要的if-else分支判断性能损耗。