乐趣区

关于数据库:分布式数据库SQL引擎之解析器

SQL 引擎是云溪数据库外围零碎之一,次要包含三局部:解析器、优化器、执行器,它解决客户端传来的命令,解析器将命令解析编译成数据库能辨认运行的命令,优化器将命令进行优化,优化的优劣间接影响数据库的性能,执行器最初进行执行命令。

一条 SQL 语句的生命周期:

图 1 SQL 执行流程

从图 1 能够看出,一条语句在数据库中的执行过程如下:

(1)数据库接管客户端传来的语句文本;

(2)通过词法解析失去一组词条;

(3)词条通过语法解析失去语法树(Abstract Syntax Tree,AST);

(4)AST 通过语义解析失去表达式供优化器应用;

(5)通过规定优化(Rule-Based Optimization,RBO),次要是做查问的重写,如表达式化简,谓词下推等;

(6)再通过代价优化(Cost-Based Optimization,CBO)失去最优的查问表达式,此过程次要是列举所有门路并计算各门路的代价,抉择代价最小的门路作为打算构建的根底;

(7)构建逻辑打算再构建物理打算;

(8)执行器执行打算;

(9)返回后果。

SQL 解析器:

所有进入数据库的语句都须要通过解析的过程,能力被数据库所辨认,解析器次要包含三局部:词法解析、语法解析、语义解析。

词法解析:

词法解析的工作是从左到右一个字符一个字符地读入解析程序,对字符流进行扫描而后依据构词规定辨认字符并切割成一个个词条,切词的规定是遇到空格进行切割,遇到“;”完结词法解析。

Example: SELECT a FROM test WHERE a > 4;

通过词法解析后,该 SQL 语句被切割成以下词条:

语法解析:

语法分析的工作是在词法剖析的后果上将词条序列组合成各类语法短句,组成的短句将与既定的语法规定进行匹配,若匹配胜利则生成对应的形象语法树(Abstract Syntax Tree,AST), 否则报语法错误。

Example:

存在以下 simple_select_clause 的既定规定:

图 2 simple_select_clause 语法规定

图 2 规定中红色标记的都是终结符,个别是大写的关键字以及符号等,小写的是非终结符,个别用作规定的命名。

进行语法解析时,会将词法解析生成的词条逐个移进,每移进一个词条都会进行匹配规定的操作,如果匹配得上就会进行规约操作,否则持续进行移进,直到所有词条移进结束且胜利规约则解析结束,生成对应的语法树。

例如词法解析失去词条如下:

语法解析先移进 SELECT 词条,无规约且残余词条,持续移进;移进词条 a,a 能够规约成 tartet_list,进行规约操作,用 tartet_list 代替词条 a,还残余词条,持续移进;移进 FROM,无规约且残余词条,持续移进;移进 test,test 能够规约成 from_list,进行规约操作,用 from_list 代替词条 test,而后 from 和 from_list 还能够规约成 from_clause,持续进行规约操作,还残余词条,持续移进;移进 WHERE,无规约且残余词条,持续移进;移进 a,a 能够规约成 expr,用 expr 代替 a,残余词条,持续移进;持续移进 >,无规约且残余词条,持续移进;持续移进 4,4 能够规约成 expr,用 expr 代替 4,此时 expr>expr 能够规约成 a_expr,用 a_expr 代替 expr>expr,而后 where 和 a_expr 规约成 where_clause,最终 SELECT 和 target_list 和 from_clause 和 where_clause 规约成 simple_select_clause,至此解析结束,而后生成对应的语法树。

语义解析:

语义剖析的工作是对语法解析失去的语法树(AST)进行有效性审查,如表、列、列类型、函数、表达式等进行查看。

例如查问语句:SELECT a FROM test WHERE a > 4;

针对下面的例子将会审查三个中央:

1、from_clause;审查语句中的表 test 是否存在;

2、target_list;审查 a 列是否是 from 子句某个关系或视图的属性;

3、where_clause;审查 a 列是否是 from 子句某个关系或视图的属性且 a 列的类型是否能进行 >4 的比拟操作。

语义解析完结后会生成对应表达式供优化器应用。

退出移动版