这是我参与「第四届青训营 」笔记创作活动的的第2天
前言:跟着老师在课程上的讲解,把知识点和老师讲解的知识做了总结和归纳,以及一些自己对于老师话语的理解都整在了笔记里。
-
SQL的处理流程
-
Parser
首先通过词法分析得到关键词、数值常量、字符串常量、运算符等,然后通过语法分析,将token组成AST node,最终得到一个AST
实现方式:递归下降,Flex,Bison,JavaCC,Antlr
-
Analyzer和Logical Plan
读取元数据,确保SQL的合法性,生成Logical Plan
逻辑描述SQL对应的分布计算操作,计算操作的基本是算子
-
查询优化
因为sql只是告诉做什么,没有说怎么做,而查询优化就是要找到一个正确且执行代价最小的物理执行计划
-
Physical Plan 和 Executor
-
Plan Fragment:执行计划子树
正如图中所示,利用上数据的物理分布,增加shuffle算子来最小化网络数据传输
-
Executer
单机并行:cache,pipeline,SIMD
多级并行:一个fragment对应多个实例
-
-
-
常见的查询优化器
-
分类:
-
RBO
-
根据关系代数等价语义,重写查询
-
基于启发式规则
-
会访问表的原信息,不会具体涉及具体的表数据
-
优化原则:
- Read data less and faster(I/O)
- Transfer data less and faster(Network)
- Process data less and faster(CPU & Memory)
-
优化规则:
- 列裁剪:提前把不需要的列数过滤掉
- 谓词下推:尽可能先进行谓词选择,把查询的列数尽可能提前减少
- 传递闭包:根据表达式的等价关系与过滤条件,推导出一个新的过滤条件
- Runtime Filter(min - max ; in - list ; bloom filter)
-
优点:实现简单,优化速度快
缺点:不保证得到最优的执行计划
-
-
CBO
-
使用一个模型估算执行计划的代价,选择代价最小的执行计划
- 执行计划的代价等于所有算子的执行代价之和
- 通过RBO得到可能的等价执行计划
-
算子代价:CPU,内存,磁盘I/O,网络I/O等代价
-
和算子输入数据的统计信息有关:输入,输出结果的行数,每行大小...
- 叶子算子Scan:通过统计原始表数据得到
- 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
-
和具体的算子类型,以及算子的物理实现有关
-
统计信息
- 原始表统计信息
- 表或者分区级别:行数,行平均大小...
- 列级别:min、max、num nulls等
- 推导统计信息
- 选择率:对于某一个过滤条件,查询会从表中返回多大比例的数据
- 基数:在查询计划中常指算子需要处理的行数
- 原始表统计信息
-
统计信息的收集方式
- 在DDL里指定需要收集的统计信息,数据库会在数据写入时手机或者过呢更新统计信息(但是会影响数据写入数据库的速度)
- 手动执行explain analyze statement,触发数据库收集或者更新统计信息(但是需要手动,信息可能不是最新)
- 动态采样
-
执行计划枚举(找到最小代价)
贪心算法
动态规划:基于成本最优假设,通过局部的最优解得到全局的最优解
-
-
-
-
-
社区开源实践 - Apache Calcite
- 是对SQL语句进行解析优化,得到执行计划(即统一的SQL查询引擎)
- 支持异构数据模型: 关系型;半结构化;流式;地理空间数据
- 内置RBO和CBO
- RBO --- HepPlanner
- 优化规则:
- Pattern:匹配表达式子树
- 等价交换:得到新的表达式
- 匹配规则
- 深度优先
- TOP_DOWN
- BUTTOM_UP
- 优化规则:
- CBO --- VolcanoPlanner
- 基于Volcano/Cascade框架
- 使用TOP-DOWN 动态规划搜索
- 可以使用剪枝来减少搜索空间
- TOP-down遍历:选择winner构建最优执行计划
- RBO --- HepPlanner
-
前沿趋势(DATA + AI)
- AI4DB
- 自配置
- 自诊断和自愈合
- 自优化
- DB4AI
- 内嵌人工智能算法
- 内嵌机器学习框架
- AI4DB
随着技术的不断进步,有越来越多的新技术需要学习,就像老师预习文档里提供的论文,技术的不断革新是我们不断学习的动力。