https://www.iteblog.com/archives/9806.html
迭代模型(火山模型)
物化模型
向量化执行
编译执行
编译执行基本做法是使用Codegen 技术,将所有的算子编译成一个函数,通过PUSH 的模型自下而上通过数据上推完成计算。典型的代表产品有Spark 和 Peloton。
向量化执行和编译执行的比较
参考:
云原生数据仓库TPC-H第一背后的Laser引擎大揭秘
Spark代码生成-全阶段代码生成
向量化执行
优点:
- 充分发挥CPU 的流水线执行(不会出现大量虚函数调用)
- 内存的顺序访问,减少cache的miss(一次缓存多条记录在内存中)
缺点:
- 实现逻辑比较复杂
- 需要批量的数据,并不适合每次计算数量较小的OLTP 场景
- 需要缓存批量数据,缓存本身带来一定的内存开销。
编译执行
优点:
- 充分发挥CPU 的流水线执行(不会出现大量虚函数调用)
- 由于每次计算的都是一行数据,执行过程可以将这一行数据保存在寄存器里面,寄存器计算代替内存计算
- 由于每次计算的都是一行数据,执行过程可以将这一行数据保存在寄存器里面,寄存器计算代替内存计算
缺点:
- PUSH 模型控制逻辑比较复杂
- 由于采用单条计算,无法做到内存的顺序访问,所以它整体的Cache miss 率比较高