概述
当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函数将逻辑计划转化为物理计划。