SQL 查询优化器浅析 | 青训营笔记

137 阅读2分钟

这是我参与「第四届青训营 -大数据场」笔记创作活动的的第1篇笔记

为什么大数据领域中SQL特别受欢迎?

sql可以让版本维护的成本降到非常低,并且提高维护的速度

SQL的一生

sql从编译→执行→查询出来结果这个过程中经历了什么?

image.png

上图是一个sql从编译到执行的简易流程图

  1. Parser模块,他会对一条sql语句进行切分,组合成一颗抽象语法树

    举个例子,select a from b where xxx ,按照下图所示的语法树中,selectList里就是a,FromClause里就是b,WhereClause里就是xxx

image.png

  1. Analayzer模块,他会去检查sql写的是不是正确的,然后把这颗抽象语法树上的节点和数据、函数进行绑定,替换为一个逻辑计划
SELECT country.name, SUM(weblog.bytes) as total FROM country
INNER JOIN geoip ON country.id = geoip.country_id 
INNER JOIN weblog ON geoip.host = weblog.host 
WHERE weblog.reply = "200" and weblog.host is not null 
GROUP BY country.name
ORDER BY total
LIMIT 10

比如是这样一个sql语句,就会转换为下面这样的逻辑计划树,最下面是三个表名,然后通过SCAN中绑定sql语句中的where筛选。JOIN将两张表进行连接,AGGREGATE是一些groupby操作,TopN是orderby和limit操作。以这样的连接规则这样构成一张logical plan

image.png

  1. Optimizer模块,是整个流程中最核心的模块。他是对这个逻辑计划进行优化,不然执行效率是非常慢的。这里主要学习两个最关键的优化器(RBO、CBO)

    1. RBO是基于规则进行优化,列裁剪、谓词下推等

      • 列裁剪:只要查特定列,那就在扫描前把这个列提前筛选出来
      • 谓词下推:在两个表进行join之前,先根据查询条件进行一波筛选,这样join的数据量就减少了
    2. CBO是基于代价的优化。比如一条sql翻译成spark有几个算子可以选择,估算一下哪个算子代价最低,选这个就完事了。具体可以用贪心或者动态规划的方法,这里不详细介绍了

  2. 最后以sparksql为例,用最优的执行计划生成java字节码,将SQL转化为DAG,用RDD计算