OceanBase源码学习: 2.2 查询重写和转换
OceanBase源码学习: 2.2 查询重写和转换
OceanBase 中的查询重写和转换系统在parsing/resolution和optimization阶段之间处理 SQL 语句。它采用基于规则的转换来提高查询执行效率和正确性,并支持高级优化。该系统通过各种重写规则对解析后的 SQL 语句 (ObDMLStmt) 进行转换,然后将其传递给基于代价/成本的优化器(CBO)。
架构
转换系统采用基于规则的架构,多个转换规则按顺序应用于 SQL 语句。该系统设计为可扩展的,可以轻松添加新的转换规则。
核心架构图
转换管道(Transformation Pipeline)
转换过程遵循明确定义的管道,语句经过多个阶段进行处理。每个阶段应用特定类型的转换。
管道工作流
核心组件
ObTransformerImpl
主协调器类, 管理转换过程并以正确的顺序应用规则。
transform() | |
do_transform() | |
check_transform_validity() |
ObTransformRule
所有转换规则的基类,提供通用的功能和接口。
ctx_ | |
transform_one_stmt() | |
need_transform() |
ObTransformerCtx
包含转换期间所需的共享资源的上下文对象。
expr_factory_ | |
session_info_ | |
allocator_ | |
schema_checker_ |
表达式处理系统
表达式系统为所有查询转换提供了基础,ObRawExpr 作为所有表达式类型的基类。
表达式层次结构
转换类型(Transformation Types)
预处理转换
ObTransformPreProcess 类处理初始语句清理和规范化:
右连接转换:将右连接转换为左连接以实现标准化 表达式形式化:确保表达式的正确输入和验证 条件展平:将嵌套的 AND/OR 条件展平为简化形式 物化视图扩展:将物化视图扩展为其底层查询
表达式简化
ObTransformSimplifyExpr 类执行各种表达式优化:
常量折叠:在编译时运算常量表达式 NULL条件替换:尽可能简化 IS NULL条件布尔表达式优化:简化 TRUE/FALSE表达式冗余表达式删除:消除不必要的表达式
谓词转换
ObTransformPredicateMoveAround 类优化了谓词位置:
谓词下推:将谓词移近数据源 谓词提取:在有益时从子查询中提取谓词 连接条件推导:从现有谓词中推导出新的连接条件
查询范围处理
ObQueryRange 系统从谓词中提取范围条件以实现高效的索引使用。
范围提取过程
关键数据结构
ObQueryRange | |
ObKeyPart | |
ObQueryRangeCtx | |
ObNewRange |
实用程序
ObTransformUtils 类为转换提供了必要的实用程序:
核心实用程序
decorrelate()extract_param_exprs(),replace_expr() | |
add_new_table_item()merge_from_items_as_inner_join() | |
create_new_column_expr()create_columns_for_view() | |
is_correlated_expr()is_simple_correlated_pred() | |
is_column_unique()is_columns_unique() |
LazyJoinInfo 结构
与 SQL 处理集成
转换系统可以与其他 SQL 处理组件无缝集成, 包括:
转换系统上接语义解析器
接收具有类型表达式的已完成解析的 ObDMLStmt对象列引用绑定到 schema 信息 子查询正确嵌套和关联
转换系统结果输出至优化器
生成简化和优化的语句结构 提取范围信息以进行索引选择 连接条件针对连接排序算法进行了规范化
与计划缓存的协调
转换结果可以缓存用于参数化查询 维护表达式参数信息以供计划重用
更多详细内容请关注我的github: https://github.com/digoal/blog