SQL Optimizer 解析 | 青训营笔记

98 阅读2分钟

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

今天学习了课程《SQL Optimizer 解析》

SQL Optimizer 解析

什么是SQL

SQL是访问和处理关系数据库的计算机标准语言。也就是说,无论用什么编程语言(Java、Python、C++……)编写程序,只要涉及到操作关系数据库,比如,一个电商网站需要把用户和商品信息存入数据库,或者一个手机游戏需要把用户的道具、通关信息存入数据库,都必须通过SQL来完成。

在数据库中通过 SQL 语句来操作数据的。但是 SQL 本身只是文本数据,数据库需要在接收 SQL 文本、验证合法性等步骤之后才能对 SQL 语句进行处理。这其实是在计算机科学非常经典的编译问题,与程序语言的编译器十分相似。

SQL的处理流程

img

SQL语句会经过Parser组件生成抽象语法树AST,然后抽象语法树AST经过Analyzer组件生成逻辑执行计划

(也就是抽象的指导数据查询的语句),然后逻辑执行计划通过Optimizer组件生成物理执行计划,最后输出的Executor中执行SQL语句的具体操作。

Parser 主要的功能是将 SQL 语句文本按照预先定义的 SQL 语法规则进行解析,并将其转换为抽象语法树(Abstract Syntax Tree, AST)。抽象语法树是计算机科学中编译原理的一个术语。它以树形表现编程语言的语法结构。其中Parser组件的主要功能是:

  1. 把文本变成抽象语法树结构(AST)
  2. 涉及词法分析阶段(拆分字符串,提取关键字,字符串,数值等)和语法分析阶段(把词条按照定义的语法规则组装成抽象语法树结构)
  3. 和编译原理课程里的“前端”知识相关

Analyzer组件的主要功能是:

  1. 访问库/表元信息并绑定
  2. 判断 SQL 是否合理,比如数据库,表和列名是否存在,列的数据类型是否正确
  3. 将 AST 转换成逻辑计划树(在某些系统中这个工作由一个 Converter 完成)