SQL 查询优化器浅析课前篇 | 青训营笔记

91 阅读3分钟

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

一、大数据体系和 SQL

编译原理相关的基础知识

  • 词法分析(Lexical Analysis)

    词法分析的输入是源程序,输出是识别出的记号流。目的是识别单词。至少分以下几类:关键字(保留字)、标识符、字面量、特殊符号。

  • 语法分析(Syntactic Analysis)

    输入是词法分析器返回的记号流,输出是语法树。目的是得到语言结构并以树的形式表示。对于声明性语句,进行符号表的查填,对于可执行语句,检查结构合理的表达式运算是否有意义。

  • 抽象语法树(Abstract Syntax Tree,AST)

    抽象语法树是源代码抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构。

SQL 语句的执行环节

首先会经过分析器,进行语法分析和语义检查,得到一棵语法分析树,然后经过查询优化器得到查询计划,最后交给执行器进行执行。

graph LR
SQL语句 --> 分析器 --语法分析树--> 优化器 --查询计划--> 执行器 --> 查询结果 

二、常见的查询优化器

从几个可能的计划中选择一个执行计划的过程称为优化。查询优化器负责生成 SQL 语句的有效执行计划,是关系型数据库管理系统的核心之一,决定对特定的查询使用哪些索引、哪些关联算法、从而使其高效运行。

  • Top-down Optimizer

    自上而下的优化,从想要的最终结果开始,然后在树上寻找最适合的目标。

  • Bottom-up Optimizer

    自下而上的优化,从零开始,然后制定计划以达到想要的最终结果。

  • Rule-based Optimizer,RBO

    基于规则的优化器,规则就是人们以往的经验,或者是采用已经被证明是有效的方式。通过在优化器里面嵌入规则,来判断 SQL 查询符合哪种规则,就按照相应的规则来制定执行计划,同时采用启发式规则去掉明显不好的存取路径。

  • Cost-based Optimizer,CBO

    基于代价的优化器(CBO,Cost-Based Optimizer),这里会根据代价评估模型,计算每条可能的执行计划的代价,也就是 COST,从中选择代价最小的作为执行计划。相比于 RBO 来说,CBO 对数据更敏感,因为它会利用数据表中的统计信息来做判断,针对不同的数据表,查询得到的执行计划可能是不同的,因此制定出来的执行计划也更符合数据表的实际情况。

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

  • Apache Calcite

    一款开源SQL解析工具, 可以将各种SQL语句解析成抽象语法术AST(Abstract Syntax Tree), 之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中

  • Orca

    一款由微软提供的用于 Windows Installer 数据库表编辑器

  • Volcano/Cascade 框架

四、SQL 相关的前沿趋势

  • 计算和存储分离
  • HSAP, HTAP, HTSAP
  • Cloud Native, Serverless
  • 数据仓库,数据湖,湖仓一体,联邦查询
  • 智能化:AI4DB,DB4AI