Oceanbase查询处理:SQL执行

概述

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

  1. 对SQL进行语法和词法解析,生成查询语法树。

  1. 对查询语法树进行语义分析,生成对应的查询对象。

  1. 依据关系代数对查询对象进行等价改写。

  1. 为查询对象生成执行代价最优的逻辑计划。

  1. 依据逻辑计划生成可执行的物理计划。

  1. 执行生成的物理计划。

主要模块

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中取得缓存的执行计划。

  1. 如果plan cache中没有找到,则调用handle_physical_plan函数进行处理。

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

  1. 调用handle_parser函数对SQL语句进行解析。

  1. 调用generate_physical_plan函数使用解析结果生成物理计划。

  1. 调用pc_add_plan函数将执行计划保存到plan cache中。

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

  1. 调用generate_stmt函数对语法树进行语法和词法解析,生成ObStmt对象。

  1. 调用transform_stmt函数对ObStmt对象进行改写。

  1. 调用optimize_stmt函数为ObStmt对象生成一组优化后的逻辑计划。

  1. 调用code_generate函数将逻辑计划转化为物理计划。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值