Doris实时数仓实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.4 向量化执行引擎

传统的数据库都是典型的迭代模型,执行计划中的每个算子通过调用下一个算子的next()方法来获取数据,从最底层的数据块中一条一条读取数据,最终返给用户。它的问题在于每个Tuple都要调用一次函数,开销太大,而且因为CPU每次只处理一条数据,无法利用CPU技术升级带来的新特性,比如SIMD。向量化模型每次处理的是一批数据,这些数据会被保存在一种叫作向量的数据结构里,由于每次处理的是一批数据,因此可以在每个Batch内做各种优化。简单地说,向量化执行引擎=高效的向量数据结构(Vector)+批量化处理模型(nextBatch)+Batch内性能优化(例如SIMD等)。

原本向量化执行引擎只是一个概念,是ClickHouse将其变成了现实,并展示出强大性能。通过向量化执行引擎原理的介绍,我们可以看出,向量化执行引擎非常适合基于列存储的OLAP数据库,可以极大地提高并行查询效率。在ClickHouse之后,OLAP数据库配套向量化执行引擎几乎已经成为标配。目前,除了Doris以外,openGuass、Polar-x、TDSQL实现了部分或所有向量化执行引擎功能。

Doris是在0.15版本中引入向量化执行引擎的,并在1.0版本中逐渐成熟。根据Doris的演进计划,向量化执行引擎会逐步替换当前的行式SQL执行引擎,以充分释放CPU的计算能力,达到更强大的查询性能。

在绝大多数场景中,用户只需要将Session变量enable_vectorized_engine设置为true,FE节点在进行查询规划时就会默认将SQL算子与SQL表达式转换为向量化的执行计划,从而提升SQL执行性能。