SQL查询Optimizer解析| 青训营笔记

89 阅读2分钟

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

一分钟总结本结课程

SQL查询Optimizer, 即SQL优化器.由于SQL语言是声明性语言,其距离机器实现之间差距很大,具体机器怎么实现则要通过Optimizer对SQL语言进行解析,找到最优的机器实现算法. Optimizer 分为基于规则(Rule-based,RBO,就是人们根据经验来看,先筛选数据还是先读入哪些数据,设计一套规则),和基于成本(cost-based,CBO, 让损失函数最小的处理顺序,设置损失函数还有数据统计是里面重要内容). 目前主流Optimizer 很多都是RBO和CBO两种功能都有,最后取最优. 未来发展DATA+AI, 实现Optimizer更好的性能.

大数据体系

image.png

01、大数据体系和SQL

image.png

SQL 处理流程

image.png

Parser

String -> AST (abstract syntax tree)

词法分析:拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token

语法分析:将 token 组成 AST node, 最终得到一个AST。

实现:递归下降(ClickHouse),Flex 和Bison(PostgreSQL), JavaCC(Flink), Antlr(Presto, Spark)

image.png

Analyzer and Logical Plan

image.png

查询优化

1、SQL是一种声明式语言,用户只描述做什么没有告诉数据库怎么做 2、目标:找到一个正确且执行代价最小的物理执行计划 3、查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的 4、一般SQL越复杂,Join的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可能有成百上千倍

Physical Plan and Executor

image.png

小结

image.png

02、常见的查询优化器

查询优化器分类

image.png

RBO

RBO 关系代数

image.png

RBO-优化规则

image.png

RBO - 列裁剪

image.png

RBO - 谓词下推

image.png

RBO - 传递闭包

image.png

RBO - Runtime Filter

image.png

将过滤出的第一个表的siteld 最大和最小之间的作为范围 用于过滤第二个表(缺点在于稀疏情况)

或 in-list意思是将第一个表滤出的数作为字典对第二个表进行搜索(缺点在于数多的时候)

小结

image.png

CBO - 概念

image.png

CBO-统计信息

image.png

image.png 自动执行可能会影响实时导入速率

手动执行,避免了实时更新影响速率,但有可能忘记手动导致没更新

动态采样 ,抽样估计总量

CBO-统计信息推到规则

选择率:使用筛选条件之后,筛选剩下的东西的占比 image.png 倒数第二行错了 应为 literal>max:0

CBO - 统计信息的问题

image.png

CBO-执行计划枚举

image.png

image.png

CBO效果- TPC-DS Q25

image.png

image.png

小结

image.png

03、社区开源实践

image.png

Apache Calcite

image.png

Calcite RBO

image.png

VolcanoPlanner

image.png

image.png

image.png

小结

image.png

04、前沿趋势

image.png

image.png

image.png

总结

image.png