一条SQL语句是怎么在底层逐渐实现其功能的???

发布时间:2023年12月22日

深入理解SQL引擎

%% 小到传统的单机数据库,大到分布式数据库、大数据计算引擎,他们大都可以借助**SQL引擎完成“接受一条sql语句然后返回查询结果”**的功能。SQL解析主要包含:词法分析、语义语法分析、优化和执行代码生成。大致可以通过下面的流程来概括:
。大致可以通过下面的流程来概括:

一条sql语句首先会经过::词法分析进行“分词”操作::,然后利用::语法解析器进行语法分析并形成一棵抽象语法树AST::

词法分析(Lexical Analysis)

%% 词法分析主要是把输入转化成若干个Token,其中Token包含key和非key
**
++如图所示,MySQL关键字都会被标识为Key,非关键字就是非key++

通常情况下,词法分析可以使用Flex来生成,但是我们熟悉的MySQL并没有使用该工具,而是手写了词法分析的部分::具体原因据说是为了提高效率和灵活性::

语法分析(Grammer Analysis)

%% 语法分析是生成语法树的过程,这是整个解析过程中最核心、最复杂的环节。ANTLR是一个功能强大的语法分析生成器,可以用来读取、处理、执行和转换结构化文本或者二进制文件。在大数据的一些SQL框架里面有广泛的应用,比如Hive的词法文件是ANTLR3写的,Presto::好像是一个很牛的搜索引擎::词法文件也是ANTLR4实现的,SparkSQL Lambda词法文件也是用Presto的词法文件改写的,另外还有HBase的SQL工具Phoenix也是用ANTLR工具进行SQL解析的

ANTLR的解析器(Parser)
  • Parser是用来识别语言的程序,其本身包含两个部分:词法分析器和语法分析器
    • 词法分析阶段主要解决的问题是key以及各种symbols,比如INT或者ID。语法分析主要是基于词法分析的结果构造一棵抽象语法树AST::虽然Mysql用的是Bison,没用ANTLR::
      • 如图,字符串随字符流CharStream到了SQL解析器中进行词法分析变成Token,拆分完毕后再进行语法分析,TokenStream最终变成一颗AST
    • AST包含TerminalNodeRuleNode
  • 甚至可以自己写一份语法文件,在IDEA中真的可以生成自定义的Parser Tree

使用ANTLR来实现一条SQL,执行或者实现的过程大致如下:

  1. 实现词法文件(g4);
  2. 生成词法分析器和语法分析器;
  3. 生成抽象语法树(AST);
  4. 遍历AST;
  5. 生成语义树;
  6. 优化生成逻辑执行计划;
  7. 生成物理执行计划再执行。

下面是hive中的driver驱动组成部分:

解析器(SQL Parser)

  • 将SQL语句字符串转化为AST,并对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误

编译器(Physical Plan)

  • 遍历、将AST编译生成逻辑执行计划

优化器(Query Optimizer)

  • 对逻辑执行计划进行优化
  • “谓词下推”、“剪枝”等操作其实就是在这个过程中实现的

执行器(Execution)

  • 把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark
  • 例如怎么扫描数据,怎么聚合各个节点的数据等。最后就是按照物理计划来一步一步的执行
文章来源:https://blog.csdn.net/qq_65052774/article/details/135051310
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。