OceanBase 查询处理:SQL 执行

2024年 5月 7日 44.5k 0

概述

当 OBServer 接受到查询语句后,按照如下流程对其进行执行:

  1. 对 SQL 进行语法和词法解析,生成查询语法树。
  2. 对查询语法树进行语义分析,生成对应的查询对象。
  3. 依据关系代数对查询对象进行等价改写。
  4. 为查询对象生成执行代价最优的逻辑计划。
  5. 依据逻辑计划生成可执行的物理计划。
  6. 执行生成的物理计划。

主要模块

  • OBParser

使用 lax 和 yacc 对 SQL 进行语法和词法解析,为其生成一棵由 parseNode 构成的查询语法树。

  • OBStmtResolver

对查询语法树进行语义分析,为其生成 SQL 类型对应的 OBStmt 对象。

  • OBTransformerImpl

使用预定义的规则对ObStmt对象进行等价转换,将其改写为性能更好的 OBStmt 对象。

  • OBOptimizer

为 OBStmt 对象生成一组可选的逻辑计划,从中基于代价选择一个最优的计划。

  • OBCodeGenerator

根据逻辑计划中的逻辑算子创建对应的物理算子,生成可执行的物理计划。

  • OBExecutor

按照火山模型执行生成的物理计划。

代码解析

SQL 执行的入口为 OBSql::stmt_query 函数,该函数会调用 handle_text_query 进行查询处理,该函数的主要执行流程如下:

  1. 调用 pc_get_plan_and_fill_result 函数,尝试从 plan cache 中取得缓存的执行计划。
  2. 如果plan cache中没有找到,则调用 handle_physical_plan 函数进行处理。

handle_physical_plan 函数的主要执行流程如下:

  1. 调用 handle_parser 函数对 SQL 语句进行解析。
  2. 调用 generate_physical_plan 函数使用解析结果生成物理计划。
  3. 调用 pc_add_plan 函数将执行计划保存到 plan cache 中。

generate_physical_plan 函数中定义了主要的执行逻辑,流程如下:

  1. 调用generate_stmt 函数对语法树进行语法和词法解析,生成 OBStmt 对象。
  2. 调用transform_stmt 函数对 OBStmt 对象进行改写。
  3. 调用optimize_stmt 函数为 OBStmt 对象生成一组优化后的逻辑计划。
  4. 调用code_generate 函数将逻辑计划转化为物理计划。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论