分布式数据库 30 讲
王磊
光大银行首席数据架构师
29144 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 34 讲
结束语 (1讲)
分布式数据库 30 讲
15
15
1.0x
00:00/00:00
登录|注册

21 | 查询执行引擎:如何让聚合计算加速?

提高查询执行效率
多行并发处理
以向量块为单位处理数据
减少虚函数调用数量
运算符融合
数据以行为单位进行处理
虚函数调用次数过多
处理逻辑清晰
基础软件中分享硬件技术变革的产品
优点
表达式代码生成
整体代码生成
数据为中心的代码生成
优点
向量化运算符
改良方法
缺点
优点
操作符
迭代模型
思考题
代码生成
向量化模型
火山模型
查询执行引擎优化

该思维导图由 AI 生成,仅供参考

你好,我是王磊。
在 19、20 两讲中,我已经介绍了计算引擎在海量数据查询下的一些优化策略,包括计算下推和更复杂的并行执行框架。这些策略对应了从查询请求输入到查询计划这个阶段的工作。那么,整体查询任务的下一个阶段就是查询计划的执行,承担这部分工作的组件一般称为查询执行引擎。
单从架构层面看,查询执行引擎与分布式架构无关,但是由于分布式数据库要面对海量数据,所以对提升查询性能相比单体数据库有更强烈的诉求,更关注这部分的优化。
你是不是碰到过这样的情况,对宽口径数据做聚合计算时,系统要等待很长时间才能给出结果。那是因为这种情况涉及大量数据参与,常常会碰到查询执行引擎的短板。你肯定想知道,有优化办法吗?
当然是有的。查询执行引擎是否高效与其采用的模型有直接关系,模型主要有三种:火山模型、向量化模型和代码生成。你碰到的情况很可能是没用对模型。

火山模型

火山模型(Volcano Model)也称为迭代模型(Iterator Model),是最著名的查询执行模型,早在 1990 年就在论文“Volcano, an Extensible and Parallel Query Evaluation System”中被提出。主流的 OLTP 数据库 Oracle、MySQL 都采用了这种模型。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

查询执行引擎在海量数据查询下的优化策略至关重要。本文介绍了查询执行引擎的模型和优化方法,包括火山模型、向量化模型和代码生成。火山模型通过迭代器实现查询计划的执行,但存在虚函数调用次数过多和不利于发挥现代CPU特性的缺点。为了优化火山模型,可以采用运算符融合等方法。另一种优化思路是向量化模型,通过向量化运算符基于列来重写查询处理算法,充分利用CPU,提升性能。TiDB和CockroachDB的实践表明,向量化模型可以显著提升性能,达到数倍甚至数十倍的提升。这些优化方法对于加速聚合计算等查询任务具有重要意义,尤其在面对海量数据时更为关键。另外,代码生成作为另一种高效查询执行引擎,通过即时编译生成代码可以达到类似手写代码的效果,极大地提高了CPU的执行效率。向量化和代码生成是两种高效查询模型,它们在分布式数据库领域得到了广泛的实践,并在TiDB、CockroachDB和OceanBase等数据库中得到了应用。这些优化方法和技术的应用,使得查询执行引擎能够更好地发挥现代CPU的特性,从而提升查询性能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式数据库 30 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • Jxin
    感觉代码生成==编译器运行期优化。 1.针对循环做优化 2.减少过程调用开销 3.对控制流做优化 4.向量计算

    作者回复: 总结的很好。

    2020-09-25
    4
  • 幼儿编程教学
    请教老师。向量计算,是否可以理解成,本来是一行一行数据计算,现在向量,就变成多行,一个矩阵。本质就是批量一起处理。不知道理解的对不对,望指点。
    2020-11-26
    1
    1
  • xxx
    最后的代码生成应该属于 Materialization Model。用代码生成只是一种优化手段,用来尽量减少函数调用开销以及多余的物化操作。
    2023-12-18归属地:江苏
  • 勿更改任何信息
    思考题: 如redis,硬件升级内存扩大使得内存数据库出现
    2021-07-10
  • 扩散性百万咸面包
    请教老师。看过内核代码,每个Operator会调用子Operator的Next接口,为什么这是虚函数调用呢?不是普通函数调用吗?
    2021-01-12
  • 崔伟协
    火山模型怎么处理聚合如max, min,sum这些
    2020-09-29
  • 扩散性百万咸面包
    老师,这里有个问题,既然MySQL等用了火山模型,那它们为什么不改成向量化接口呢?既然提升如此明显? 感觉向量化就是把多个tuple一次返回,向量化和行式存储结合的难点在哪呢?
    2020-09-25
    2
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部