这是我参与「第四届青训营 」笔记创作活动的的第1天
sql的处理流程
sql代码通过解析器生成抽象语法树
这一过程需要:
- 词法分析:拆分字符串,得到关键词、运算符号等token(可以理解为加密过的数据)
- 语法分析:将token组成AST node,最终得到AST
分析器输入抽象语法树(AST),输出逻辑执行计划
逻辑计划在AST的基础上描述了sql的分步骤计算操作,其中每一个结点对应着一个算子,比如过滤、排序这种常见的操作。
优化器
sql本身只是描述性语言,对底层实际执行没有要求,所以优化器会对逻辑执行树进一步优化性能(大学课程期末考试中常常考优化^_^)
执行器输入逻辑执行计划,输出物理执行计划
生成物理执行计划的过程中会最小化网络数据传输,并且增加shuffle算子
同时会增加使用流水线等并行技术
速记:解分优执
查询优化
RBO(基于规则,优化原则:I/O、网络、内存方面)
列裁剪
去掉多余的列,可以减少I/O、内存占用。把逻辑树从上向下扫描,每一层不断将自己所需要的数据对应的范围向下传递,直至最底层的"SCAN"算子,此时"SCAN"算子就知道需要扫描哪些列了
谓词下推
提前过滤(其实就是期末考的有木有..把select操作尽量放在下层)
传递闭包
首先要明确闭包的定义:怎么走也走不出,闭包的世界~
我们通过已有的逻辑或者数学关系,推导出新的数学关系,并将其作为新的过滤条件,由于闭包性质所以并不会影响结果的正确性
Runtime Filter
在分析类查询中,大表之间(或大表与小表)的 Join 通常使用 Hash Join 实现,其基本原理是通过在join的probe端提前过滤掉那些不会命中join的输入数据来大幅减少join中的数据传输和计算,从而减少整体的执行时间。建议参考
查询性能优化之 Runtime Filter - 知乎 (zhihu.com)