这是我参与「第四届青训营 」笔记创作活动的第1天
今天学习了课程《SQL Optimizer 解析》
SQL Optimizer 解析
什么是SQL
SQL是访问和处理关系数据库的计算机标准语言。也就是说,无论用什么编程语言(Java、Python、C++……)编写程序,只要涉及到操作关系数据库,比如,一个电商网站需要把用户和商品信息存入数据库,或者一个手机游戏需要把用户的道具、通关信息存入数据库,都必须通过SQL来完成。
在数据库中通过 SQL 语句来操作数据的。但是 SQL 本身只是文本数据,数据库需要在接收 SQL 文本、验证合法性等步骤之后才能对 SQL 语句进行处理。这其实是在计算机科学非常经典的编译问题,与程序语言的编译器十分相似。
SQL的处理流程
SQL语句会经过Parser组件生成抽象语法树AST,然后抽象语法树AST经过Analyzer组件生成逻辑执行计划
(也就是抽象的指导数据查询的语句),然后逻辑执行计划通过Optimizer组件生成物理执行计划,最后输出的Executor中执行SQL语句的具体操作。
Parser 主要的功能是将 SQL 语句文本按照预先定义的 SQL 语法规则进行解析,并将其转换为抽象语法树(Abstract Syntax Tree, AST)。抽象语法树是计算机科学中编译原理的一个术语。它以树形表现编程语言的语法结构。其中Parser组件的主要功能是:
- 把文本变成抽象语法树结构(AST)
- 涉及词法分析阶段(拆分字符串,提取关键字,字符串,数值等)和语法分析阶段(把词条按照定义的语法规则组装成抽象语法树结构)
- 和编译原理课程里的“前端”知识相关
Analyzer组件的主要功能是:
- 访问库/表元信息并绑定
- 判断 SQL 是否合理,比如数据库,表和列名是否存在,列的数据类型是否正确
- 将 AST 转换成逻辑计划树(在某些系统中这个工作由一个 Converter 完成)