概述
当 OBServer 接受到查询语句后,按照如下流程对其进行执行:
- 对 SQL 进行语法和词法解析,生成查询语法树。
- 对查询语法树进行语义分析,生成对应的查询对象。
- 依据关系代数对查询对象进行等价改写。
- 为查询对象生成执行代价最优的逻辑计划。
- 依据逻辑计划生成可执行的物理计划。
- 执行生成的物理计划。
主要模块
- OBParser
使用 lax 和 yacc 对 SQL 进行语法和词法解析,为其生成一棵由 parseNode 构成的查询语法树。
- OBStmtResolver
对查询语法树进行语义分析,为其生成 SQL 类型对应的 OBStmt 对象。
- OBTransformerImpl
使用预定义的规则对ObStmt对象进行等价转换,将其改写为性能更好的 OBStmt 对象。
- OBOptimizer
为 OBStmt 对象生成一组可选的逻辑计划,从中基于代价选择一个最优的计划。
- OBCodeGenerator
根据逻辑计划中的逻辑算子创建对应的物理算子,生成可执行的物理计划。
- OBExecutor
按照火山模型执行生成的物理计划。
代码解析
SQL 执行的入口为 OBSql::stmt_query 函数,该函数会调用 handle_text_query 进行查询处理,该函数的主要执行流程如下:
- 调用 pc_get_plan_and_fill_result 函数,尝试从 plan cache 中取得缓存的执行计划。
- 如果plan cache中没有找到,则调用 handle_physical_plan 函数进行处理。
handle_physical_plan 函数的主要执行流程如下:
- 调用 handle_parser 函数对 SQL 语句进行解析。
- 调用 generate_physical_plan 函数使用解析结果生成物理计划。
- 调用 pc_add_plan 函数将执行计划保存到 plan cache 中。
generate_physical_plan 函数中定义了主要的执行逻辑,流程如下:
- 调用generate_stmt 函数对语法树进行语法和词法解析,生成 OBStmt 对象。
- 调用transform_stmt 函数对 OBStmt 对象进行改写。
- 调用optimize_stmt 函数为 OBStmt 对象生成一组优化后的逻辑计划。
- 调用code_generate 函数将逻辑计划转化为物理计划。