SQL优化解析|青训营笔记

202 阅读5分钟

这是我参与「第四届青训营」笔记创作活动的第1天,学习内容为《SQL Optimizer解析》,包括大数据体系和SQL、常见的查询优化器、查询优化器的社区开源实践、SQL相关前沿趋势。

一.大数据体系和SQL

1.大数据体系

  1. 从数据传输流角度可以分为:数据源、数据采集层、数据存储层、数据分析层、数据应用层;
  2. 从应用角度可以分为:基础设施、存储系统、资源调度、分析引擎、权限管控、数据开发、业务应用;
  3. 从工程角度可以分为:日志查询、监控报警、用户管理、服务管理、集群管理、集群创建、管控运维;
  4. 本次青训营重点讲解分析引擎、存储系统、存储分布式一致、消息队列、资源调度。

2.SQL

2.1 为什么把SQL查询优化放在第一部分?

1.SQL非常流行,比编程语言简单;
2.很多系统都支持SQL;
3.希望通过SQL处理所有的大数据。

2.2 SQL的处理流程

image.png 重点在Optimizer

  1. Parser: 将输入文本变成抽象语法树(AST);
  2. Analyzer: 将AST转换为逻辑计划树(Logical Plan);
  3. Optimizer和Executor:

1.查询优化原因:SQL是声明式语言,用户只描述做什么,没有告诉数据库怎么做;
2.查询优化目标:找到一个正确的且执行代价最小的执行计划;
3.物理执行计划(Physical Plan)和Executor

3.1 优化后的逻辑计划(树)---->分布式执行计划树
3.2 执行计划树(Plan Fragment):包含完整执行计划的一部分,由逻辑执行计划拆分得到。
    利用数据的物理分布,分布式系统中,一张表数据在多个节点上,读数据时保证每个节点只读本地数据,否则远程读取会有多余网络开销,更慢;
    增加shuffle算子,节点可以一边发送,一边接收数据。
3.3 Executor: 单机并行和多机并行。多机并行策略是一个fragment对应多个实例,即一个fragment在不同节点都有,该fragment来自同一张表,但对应同一张表不同数据,同时还要考虑数据亲和性。

二.常见的查询优化器

1.RBO(Rule-based Optimizer)

1.根据关系代数等价规则对逻辑计划进行变化;
2.常见优化方式:列裁剪、谓词下推、传递闭包、Runtime filter:

1.列裁剪:从上往下扫描,将需要的列往下传递合并得到新的列集合,最后scan操作只需扫描需要的列;
2.谓词下推:对于某些含谓词的查询,谓词的过滤操作先后顺序不影响结果。因此尽可能的把谓词数据往下放,尽早过滤掉不必要的数据;
3.传递闭包:基于关系代数传递性,例如 根据pv.siteid=user.siteiduser.siteid>123 得到一个新过滤条件pv.siteid>123,新建节点加入逻辑计划树;
4.Runtime Filter:执行时才能产生,实现方式是对于一个join,假设join是通过哈希表实现的,右边节点是构建的哈希表,左边节点遍历关系查询哈希表中数据是否存在。如果可以过滤左边的数据,那么进行join时就会很快;有3种filter,分别是min-max、in-list和bloom filter,使用bloom filter更优。

3.优点:实现简单、优化速度快;缺点:不能保证得到最优的执行计划、无法解决多表连接问题。

2.CBO(Cost-based Optimizer)

1.CBO处理流程:

image.png 2.统计信息:原始表统计信息+推导统计信息。推导统计信息包括选择率和基数,选择率指对于某个过滤条件查询会从表中返回多大比例的数据;基数指在查询计划中算子需要处理的行数。
3.统计信息的收集方式:

1.自动统计,即数据写入时收集或者更新统计信息,缺点是数据插入速度慢;
2.手动执行explain analyze statement,缺点是统计的信息比较旧;
3.动态采样,通过query实现,比如查询行数时,只选择table的一部分数据,估算出整张表的数据。

4.执行计划枚举:使用贪心算法或者动态规划算法选出最优的执行计划;
5.大数据场景下使用CBO可以显著提升查询性能。

三.查询优化器的社区开源实践

1.社区开源实践的数据库,大多数都包含RBO和CBO;
2.Apache Calcite

1.特点:支持统一的SQL查询引擎,模块化、插件化、稳定可靠,支持异构数据模型,内置RBO和CBO;
2.HepPlanner(Calcite RBO): 定义好优化规则Rule和匹配规则,使用pattern匹配子树,执行等价变换;
3.VolcanoPlanner(Calcite CBO):基于Volcano/Cascade框架,核心是Memo、动态规划搜索、剪枝。

四.SQL相关前沿趋势

1.存储计算分离、一体化:事务型和分析型查询、事务+分析+serving合在一起(一个系统内完成);
2.云原生serverless:动态调整集群规模(没流量缩减计算节点,否则扩充);
3.湖仓一体:结合数据仓库和数据湖,保留原始数据,统一SQL查询、联邦查询;
4.DATA+AI

1.AI4DB:自配置(智能调参、负载预测/调度)、自诊断和自愈合(错误恢复和迁移)、自优化(统计信息估计、代价估计、学习型优化器和索引/视图推荐)
2.DB4AI:内嵌人工智能算法、内嵌机器学习框架

五.个人思考和拓展部分

1.CBO执行计划枚举使用的贪心算法的贪心准则和正确性证明;
2.CBO统计信息的推导那里,如何使用直方图处理不均匀分布数据;
3.对于NOSQL,是否也有对应的查询优化方法。