SQL 查询优化器浅析

103 阅读3分钟

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

SQL是一种声明式语言,用户只描述怎么做,没有告诉数据库怎么做。 目标:找到一个正确且执行代价最小的物理执行计划。 查询优化器是数据库的大脑,最复杂的模块,很多问题都是NP的,在大数据场景下对查询性能至关重要。需要感知数据分布,充分利用数据的亲和性。按照最小化网络数据传输的目标把逻辑计划查分成多个物理计划模块。 SQL越复杂,Join的表越多,数据量越大,查询优化的意义就越大,因为

CBO: 统计信息: 1.原始表统计信息 表或者分区级别:行数、行平均大小、表在磁盘中占用了多少字节等 列级别:min,max,num nulls,num not nulls,num distinct value(NDV),histogram等 2.推导统计信息 选择率:对于某个过滤条件,查询会从表中返回多大比例的数据。 基数:在查询计划中常指算子需要处理的行数。 3.统计信息的收集方 在DDL里指定需要收集的统计信息,数据库会在数据写入时收集或者更新统计信息 手动执行explain analyze statement,触发数据库收集或者更新统计信息 动态采样 4.统计信息推导规则 Filter Selectivity AND条件:fs(a AND b)=fs(a) * fs(b) 5.统计信息问题 直方图(课下了解) 6.执行计划枚举 单表扫描:索引扫描(随机I/O) VS 全表扫描(顺序I/O) 如果查询的数据分布非常不均衡,索引扫描可能不如全表扫描 通常使用贪心算法或者动态规划选出最优的执行计划

社区开源实践1-Apache Calcite概念 统一的SQL查询引擎 模块化、插件化、稳定可靠 支持异构数据模型:关系型,半结构化,流式,地理空间数据 内置RBO和CBO 社区开源实践2-Calcite RBO HepPlanner: 优化规则:匹配表达子树,等价变换(得到新的表达式) 内置有100+优化规则 四种匹配规则:深度优先,拓扑排序,余TOP_DOWN相反 遍历所有的rule,直到没有rule可以被触发 优化速度快,实现简单,但是不保证最优 社区开源实践2-Calcite CBO VolcanoPlanner: 基于Volcano/Cascade框架 成本最优假设 Memo:存储候选执行计划 Group:等价计划集合 Top_down 动态规划搜索 剪枝:减少搜索空间

课后习题

  1. Top-down 和 Bottom-up 的优化方式各有什么优缺点? 顾名思义,top-down是由上至下,而bottom-up由下至上的意思。 top-down是由目的开始,推到达到目的的方法与其细节。而bottom-up则是由要采取、或是能采取的行动开始思考,最后看这些行动是否能达到目的。 Top-down思考的人会先花很多时间在搞清楚目的与框架上,bottom-up的人则是通常先把要做的事情一个个列出来后,才思考这和原本的目的有什么关系。