这是我参与「第四届青训营 」笔记创作活动的第25天
-
为什么要先讲SQL
- sql相对于其他编程语言操作较简单
- sql是很多系统都支持的接口,是事实的接口
- 希望通过sql去处理所有的大数据
-
sql处理流程
- 四个阶段:Parser、Analyzer、Optimizer、Executor
-
Parser:输入字符串,输出是一个AST(抽象语法树),
- 需要运用到词法分析(得到token)、语法分析(把token组成AST node)
- 实现:递归实现(clickhouse)、Flex(词法分析)和Bison(语法分析)、JavaCC、Antlr
- 比如将一段查询语句拆分为一棵树,以select为根节点,向下分成selectlist、from等信息
-
Analyzer:输入AST(抽象语法树),输出是一个Logical Plan(逻辑计划,用算子进行计算)
- 作用:检查并绑定元信息、SQL的合法检查、将AST转化为Logical Plan
-
查询优化(很重要):找到一个正确且代价最小的物理执行计划
- 为什么最难:1.因为复杂,往往相关问题是np的;2.join的表多,数据量大;3.需要去找合适的方法
- 需要充分利用数据的亲和性
- 按照最小化网络数据传输的目标将逻辑计划拆分为多个物理块
-
Executor:将正确且代价最小的物理执行计划转化为执行计划
- 可分为单机并行、多机并行
-
常见的查询优化器分类
-
按照遍历树顺序分:
-
Top-down Optimizer:从目标出发,由下往上遍历找最优
- eg:Volcano、SQLserver
-
Top-down Optimizer:从零出发,由上往下遍历找最优
- eg:System R 、PostgreSQL、IBM、DB2
-
-
按照优化方法分
-
RBO:基于启发式规则;根据关系代数等价语义(结合律、交换律、传递性),重写查询;会访问表的元信息,不涉及具体数据
-
优化原则
- 列裁剪:尽早把一些列去掉,减少io的占用,依次向下传递所需信息
- 谓词下推:谓词尽可能的往下推,但是下推是有条件的
- 传递闭包:根据表达式和等价关系,继续产生新的filter
- runtime filter:运行时才能实现,运行时产生的数据的到一些集合的特性传递给其它filter(可用min-max、in-list、bloom filter)
-
-
CBO:使用模型估计代价,选择代价最小的执行计划,对查询性能重要
-
算子代价:CPU、内存、磁盘I/O、网络I/O等代价
- 和算子输入信息的统计信息、算子类型、物理实现有关
-
实现过程
-
统计信息
- 原始表统计:表或者分区级别、列级别
-
推导统计信息
- 选择率:设置查询条件后,查询会从表中返回多大比例的数
- 基数:查询计划中常指算子需要处理的行数(很重要)
-
统计信息收集方式
- 在DDL中指定需要收集的统计信息
- 手动执行
- 动态采样\
-
统计信息推到规则
- 前提:列与列独立,列的值均匀(与实际不相符)
- 用户指定相关联的列,不是均与分布的情况可以用直方图处理
- AND、OR、NOT、等于、小于条件
-
执行计划枚举
- 通常使用贪心算法或者动态规划
-
-
-
-
-
社区开源实践
-
Apache Calcite:模块化,插件化,可靠
- 支持异构数据模型(关系型、半结构化、流式、地理空间数据)
-
内置RBO和CBO
-
Calcite CBO
-
ValcanoPlanner
- 基于Valcano/Cascade框架
- 成本最优假设
- Memo:存储候选执行计划,本质是AND/OR graph
- Group:等价计划集合
- Group winner:目前最优计划
- Top-down:动态规划搜索,先择winner构建最优执行计划
- 精髓:剪枝:减少搜索空间
-
-
Calcite RBO
-
HepPlanner
- 可通过Pattern、等价变换优化规则
- 内置100+优化规则
- 四种匹配规则:ARBITRARY/DEPTH_FIRST、Top-down、Top-down
- 遍历所有的规则
- 速度快、简单、不一定最优
-
-
-
-
前沿趋势\
- 存储计算分离、一体化
- 云原生、serverless
- 湖仓一体
-
DATA+AI
-
AI4DB
- 自配置
- 自诊断和自愈合
- 自由化
-
DB4AI\
- 内嵌人工智能算法
- 内嵌机器学习框架
-
-
补充信息:
- Logical Plan:逻辑地描述SQL对应的分步骤计算操作,即在SQL上的实现代码,说明了步骤,但是没说用什么方法
- left-deep tree:右边必须是表scan
-
Physical Plan(执行计划):
- Plan Fragment(执行计划子树):执行计划的一部分,最小化网络数据传输,不同Plan Fragment通过Shuffle算子连接
总结:
-这是我在字节青训营的第一节课,做到认真的去听讲,但是由于自己的基础问题,发现对于一些基础性的知识概念还是比较的不清晰,希望在接下来的过程中能够和大家一起进步,一步一步成长。