这是我参与「第四届青训营 」笔记创作活动的第1天
[第四届青训营笔记创作活动]
一、课程总体结构:
本课程整体结构从大数据体系和数据库的发展背景入手,首先简要介绍了市场上的大数据体系和基础SQL工作流程和基础知识;第二部分详细介绍了数据库分布式查询工作流程和查询优化器中的Rule-based optimizer(RBO)和Cost-based optimizer(CBO)两种查询优化规则;第三部分介绍了当前开源社区中的查询优化框架和主流优化器;第四部分介绍了查询优化器的前沿趋势。
- SQL基础知识和大数据体系
- 查询优化器规则
- 开源社区查询优化框架
- 查询优化器前沿
下面挑取课堂中
二、为什么使用查询优化器
很多同学都使用过SQL做过开发,其中可能并没有涉及查询优化工作,但是当数据量增大和查询join关系复杂,不同执行计划之间的时间和存储开销差异变得不可忽视。执行计划可以理解为为了完成同样一个SQL语句,可以使用不同的连接关系或执行方法。可以直观的理解为,查询优化器会在SQL语句编译时构造最优的抽象语法树(Abstract Syntax Tree,AST)和执行计划。具体的流程图如下所示。
三、查询优化器举例
- Rule-based optimizer
主要介绍三个RBO规则
-
列剪裁 比如我们有一张表
table1,它含有四列数据(a,b,c,d)。当我们执行查询select a from table1 where c >10时,我们可以清晰的看到,table1中只有a,c两列被用到了。分别是Selection算子用到c列和Projection算子用到a列。那么DataSource读取数据时,b,d两列则不需要读取,可以裁剪掉。 -
谓词下推 谓词下推的核心思想是让过滤操作尽可能的靠近数据源。在一个查询树中,对于任何选择都尽量早做选择,然后进行一步的处理.可见我们并不需要改写这个sql,优化器会自动去帮我们做这种优化.
-
runtime filter 基本原理是通过在join的probe端提前过滤掉那些不会命中join的输入数据来大幅减少join中的数据传输和计算,从而减少整体的执行时间。具体的过滤策略有min-max策略,in-list策略,bloom filter策略。
- Cost-based optimizer
CBO 是让执行引擎依据预先存储到数据库中表的一些实时更新的统计信息来选择出最优代价最小的执行计划来执行查询。具体的流程是,原始统计信息-算子代价计算规则-执行计划代价-枚举。
- 小结
- RBO通常有几百条经验优化规则
- RBO实现简单优化速度快
- RBO不保证得到最优解
- CBO使用代价模型和统计信息模型
- CBO使用贪心或者动态规划得到最优策略
四、个人总结:
这节课中的优化规则案例让我印象深刻,其中RBO可以理解为基于经验的优化规则,直观简单,很容易想到。而C BO可以理解为经过额外的cost计算,来使用动态规划选择最优的执行策略,思想和优化领域的分支定界比较类似,前提就是以较小的开销计算一个cost,通过额外的cost信息确定一个比较优的执行策略。