大数据体系和SQL
大数据体系
批试分析,实时分析,交互分析都是SQL的应用场景。
SQL的处理流程
- SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做
- SQL也是很多系统都支持的接口
🎈 SQL的处理流程经过了四个组件,分别是Parser、Analyzer、Optimizer、Executor
- Parser:把SQL的输入编程AST的输出
- Analyzer:AST经过Analyzer处理,输出Logical Plan这种逻辑计划
- Optimizer:Logical Plan经过Optimizer(优化器)处理,之后输出物理的执行计划Physical Plan
- Executor:Physical Plan最后经过Executor处理,返回结果给用户
- 下面详细说一下四个组件
Parser
- Parser的输出是AST(抽象语法树),要输出AST则要经过两个步骤:语法分析的词法分析
- 语法分析:拆分字符串,得到关键词,数值常量,字符串常量,运算符号等token
- 词法分析:将token组成AST node,最终得到AST
Analyzer
Analyzer可以:
- 检查并绑定Database,Table,Column等元信息
- SQL的合法性检查,比如min/max/avg都是输入的数值,不能是字符串等
- 将AST转成Logical Plan这种逻辑计划
- Logical Plan:逻辑地描述SQL对应的分步骤计算操作
- 计算操作:算子(operator)
Optimizer
🎈 Optimizer是查询优化,是一个重点
- 查询计划的目标:找到一个正确且执行代价最小的物理执行计划
- 查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的(有时无法取得最优解)
- 一般SQL越复杂Join的表越多,数据量越大,查询优化的意义就越大,因为不同执行方式的性能差别可以有成百上千倍
Executor
🎈 Executor两种运行模式:
- 单机并行:cache,pipeline,SIMD
- 多级并行:一个fragment对应多个实例
🎈 Plan Fragment:执行计划子树:
- 目标:最小化网络数据传输
- 利用上数据的物理分布(数据亲和性)
- 增加Sshuffle算子
SQL的处理主要包括解析(parse)、执行(execute)、提取(fetch)几个步骤。
SQL的执行流程:
1、在打开客户端后,最初需要和sql服务器建立连接,账号认证和校验权限。
2、认证后,客户端发生查询sql脚本给服务器
3、服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。
4、服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。
5、MySQL根据优化器生成的执行计划,再调用存储引擎的API来执行查询。
6、将结果返回给客户端。
查询优化器
常见的查询优化器
按照遍历树的顺序划分:
Top-down Optimizer:
- 从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划
- 例子:Volcano/Cascade,SQLServer
Bottom-up Optimizer:
- 从零开始,由下往上遍历计划树,找到完整的最优执行计划
- 例子:System R,PostgreSQL,IBM DB2
根据优化方法划分:
Rule-based Optimizer(RBO)
- 根据关系代数等价语义,重写查询
- 基于启发式规则
- 会访问表的元信息(catalog),不会涉及具体的表数据(data)
- Cost-base Optimizer(CBO)
- 使用一个模型估算执行计划的代价,选择代价最小的执行计划。
🎈 即RBO基于 规则,CBO基于 代价
RBO
关系代数
- 运算符和等价代换
优化原则
- 优化IO:读更少数据且更快
- 优化网络:传输的数据更少且更快
- 优化CPU和内存:处理数据更少且更快
优化方式
列裁剪
谓词下推
传递闭包
Runtime Filter
- RBO优点:实现简单,优化速度快;缺点是不保证得到最优的执行计划
CBO
🎈使用一个模型估算执行计划的代价,选择代价最小的执行计划。
- 执行计划的代价等于所有算子的执行代价之和
- 通过RBO得到可能的等价执行计划
🎈算子代价:CPU,内存等代价
- 和算子输入数据的统计信息有关
- 叶子算子Scan:通过统计原始表数据得到
- 中间算子:根据一定的推导规则,从下层算子的统计信息推导得到
CBO统计信息的收集方式
- 在DDL里指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息
- 手动执行explain analyze statement,触发数据库收集或者更新统计信息
- 动态采样
CBO小结
- CBO使用代价模型和统计信息估算执行计划的代价
- CBO使用贪心或者动态规划算法寻找最优执行计划
- 在大数据场景下CBO对查询性能非常重要