真的是面的最难的一次了,,确实全是数据库内核的,确实全是执行器和查询优化相关的,但是说出来就是不会啊,这种自己在擅长的方面被人吊起来锤的感觉让人很难过。
我也没有完全记住他面试中问了我哪些问题,先列出来这几个吧。
1.执行器的架构有哪几种?
1.最为常见的是传统的火山模型,以及一系列的优化,比如说pull模型改为push模型的优化。
优点:简单,每个 Operator 可以单独实现逻辑。
缺点:查询树调用next()接口次数太多,并且一次只取一条数据,CPU 执行效率低;而 Joins, Subqueries, Order By 等操作经常会阻塞。
2.然后是Materialization,物化模型,每个算子一次处理所有的输入,处理完之后将所有结果一次性输出。
物化模型更适合OLTP负载,这些查询每次只访问小规模的数据,只需要少量的函数调用。
3.向量化模型,是火山模型和物化模型的折衷。
向量化模型比较适合 OLAP 查询,因为其大大减少了每个 operator 的调用次数,也就简单减少了虚函数的调用。
2.执行器算子之间,使用批量传递数据比起按行传递数据的好处有哪些?坏处有哪些?
这个我确实也不知道正确答案,我搜到的坏处是,使用批量处理会降低在批处理期间的交互性。
但是我觉得这个比起来批处理带来的好处,显得也不是特别明显了。
- 批处理适用于对大量静态数据进行处理,需要等到整个分析处理结束才能获得结果(即获得最终分析处理结果的延迟较大)。一般应用于实时性要求不高,离线计算的场景下。
- 流处理适用于对每个新到达的(动态的)数据元素(Data Element)或者一个比较小的时间窗口内的数据元素进行计算,数据上的计算或者分析处理相对来讲是比较简单的,因此完成分析处理的时间非常迅速。一般应用于时效性要求比较高的场景。
这么来看的话,面试官应该问的是两种处理方式的处理场景的差异。
所以我应该回答的是批处理应对实时性要求比较高的场景,处理效果是比不上行传递处理的。
3.讲一下MPP架构?
(当时谈到了我们这边的数据库整体架构,我说我们这边是上层多个cn,下层多个