SQL的执行和优化 | 青训营笔记

202 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天

SQL Optimizer 解析

一条sql语句执行的过程: sql输入后首先由Parser进行词法分析,把sqlString转换成AST(抽象语法树),再由Analyzer进行sql合理性的检查(检查库和表、列是否真的存在)生成逻辑执行计划(逻辑地描述sql对应的分步骤计算操作),再由optimizer对计算逻辑进行优化生成物理执行计划,调度到物理机器上的Executor上进行执行。

sql---解析器--->---抽象语法树---分析器--->逻辑执行计划---优化器--->物理执行计划

为了保证资源消耗少,查询优化器需要感知数据分布,充分利用数据亲和性。按照最小化网络传输目标把逻辑计划转化成物理计划片段分布式运行。 执行计划的连接:shuffle算子

RBO:优化方向 优化io:读更少数据,优化网络,优化cpu和内存

scan好像是底层扫描表 project就是上层输出查询结果

优化策略

RBO:基于规则的优化

列裁剪:尽早裁掉不用的列 实现原理,自上而下遍历逻辑执行计划,自上而下传递需要的列集合,在scan扫描的时候只选取需要的列。

谓词下推: 谓词:where的表达式 执行计划树往下推就是时间顺序的往前,意味着更早过滤

传递闭包: 根绝表达式的传递关系和过滤条件推导出新的过滤条件

runtime filter: 执行的时候获得join语料的信息,传给另一边做优化 策略: minmax:传递范围信息 inlist:把所有distinct值传递 bloomfilter:可以快速判断在不在

CBO:基于开销的优化,计算算子代价: 根据推导规则和下层算子统计信息 执行计划枚举:贪心,动规

可以通过原始表的统计信息估算开销: 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等 列级别:min、max、num nulls、num not nulls、num distinct value等

社区实践

calcite

未来热点

AI参与的查询优化(AI4DB),分布式计算引擎机器学习(DB4AI)