OceanBase 源码学习: 2 SQL 处理系统
OceanBase 源码学习: 2 SQL 处理系统
SQL 处理系统是 OceanBase 中负责解析、优化和执行 SQL 语句的核心组件。涵盖了从原始 SQL 文本解析到执行的完整 SQL 处理流水线,包括查询解析、语义分析、优化、计划缓存和执行。该系统同时处理标准 SQL 语句和预处理语句(prepared statement),并支持 MySQL 和 Oracle 兼容模式。
架构概述
SQL 处理系统遵循分层架构,其中 SQL 语句在执行之前要经过多个处理阶段:
核心 SQL 引擎
ObSql 类是所有 SQL 处理操作的入口点。它为不同类型的 SQL 执行提供了三个主要接口:
ObSql 类维护几个关键组件:
opt_stat_mgr_:基于成本优化的统计管理器transport_:用于分布式执行的 RPC 传输vt_partition_service_:虚拟表分区服务rs_mgr_:用作集群协调的根服务管理器
SQL处理管道
SQL 处理管道通过多个阶段将原始 SQL 文本最终生成可执行计划:
管道中的关键处理方法:
handle_text_query():SQL 文本查询处理的主入口点fill_result_set():使用字段元数据和执行计划填充结果集sanity_check():验证输入参数和系统状态
表达式系统
表达式系统通过全面的类型系统和评估框架(表达式计算)处理所有 SQL 表达式:
表达式类型系统包括 2000 多种不同的表达式类型,涵盖:
基本数据类型( T_NULL,T_INT,T_VARCHAR,T_NUMBER)算术运算符( T_OP_ADD,T_OP_MINUS,T_OP_MUL,T_OP_DIV)比较运算符( T_OP_EQ,T_OP_LT,T_OP_GT,T_OP_LIKE)系统函数( T_FUN_SYS_SUBSTR、T_FUN_SYS_UPPER、T_FUN_SYS_COUNT)聚合函数( T_FUN_MAX、T_FUN_MIN、T_FUN_SUM、T_FUN_AVG)
错误处理框架
OceanBase 实现了完善的错误处理体系,错误码超过 10000 个,按功能域组织如下:
关键错误处理组件:
按子系统划分错误代码的范围,以避免冲突 每个错误都包含与 MySQL 和 Oracle 兼容的错误代码和消息 错误消息支持动态上下文信息的参数化 SQL 状态码支持标准 SQL 错误分类
常见SQL处理错误代码:
OB_ERR_PARSE_SQL(-5000):SQL parsing 错误OB_ERR_RESOLVE_SQL(-5001):SQL resolution 错误OB_ERR_GEN_PLAN(-5002):计划生成错误OB_TIMEOUT(-4012):查询超时错误
执行计划缓存
SQL 处理系统与计划缓存紧密集成,以实现高效的计划重用:
计划缓存系统提供:
SQL 参数化,支持类似 Query 的计划重用 采用多版本计划存储支持 schema 模式的演化 根据内存压力和使用样式自动驱逐计划缓存 收集 plan 统计信息用于性能监控
事务解绑的语句级路由支持
SQL 处理系统支持对Transaction-Free事务解绑的语句级路由特殊处理,允许在临时节点上执行某些语句:
Transaction-Free 仅支持特定语句类型:
DML 语句( SELECT,INSERT,UPDATE,DELETE)变量集操作( SET命令)数据库使用操作( USE DATABASE)prepared statement 操作(启用时)
系统通过CHECK_STMT_SUPPORTED_BY_TXN_FREE_ROUTE宏来验证 Transaction-Free 路由兼容性,从而确保:
该语句类型在允许列表中 物理计划不包含数据库链接 会话已正确配置将要执行的临时节点 更多详细内容请关注我的github: https://github.com/digoal/blog