OceanBase源码学习: 2.3 优化器
OceanBase源码学习: 2.3 优化器
本文介绍 OceanBase 中基于成本的查询优化器(CBO),重点介绍连接顺序枚举、访问路径选择和物理计划生成。该优化器接受逻辑重写的查询,并使用动态规划和成本估算生成最优的物理执行计划。
架构概述
查询优化器对 ObLogPlan 表示的逻辑计划进行操作,并通过 ObStaticEngineCG 生成物理执行计划。核心优化过程使用 ObJoinOrder 管理的“连接顺序枚举的动态规划”。
连接顺序枚举(Join Order Enumeration)
优化器使用动态规划来枚举连接顺序,从单个表到完整的连接树自下而上地构建解决方案。此过程由表示每个级别的部分连接结果的 ObJoinOrder 管理。
基础级别生成
优化器首先使用 generate_base_level_join_order() 生成基表的访问路径:
动态规划算法
连接枚举使用 generate_join_levels_with_IDP() 进行逐级动态规划:
基于成本的优化器
优化器使用框架来评估和比较执行计划。成本估算通过ObOptEstCost和ObCostTableScanInfoEstimateCostInfo结构来考虑 CPU、I/O 和网络成本。
成本估算组件
Skyline Pruning
为了管理指数级搜索空间,优化器使用 Skyline Pruning 来消除 dominated plan:
物理计划生成
选择最优逻辑计划后,ObStaticEngineCG::generate() 通过递归遍历将逻辑运算符树转换为物理运算符表示。
代码生成过程
关键类和组件
ObJoinOrder | generate_base_paths()generate_join_paths() | |
ObLogPlan | generate_join_orders()generate_raw_plan() | |
ObLogicalOperator | get_cost()allocate_exchange(),get_card() | |
ObStaticEngineCG | generate()postorder_generate_op() | |
AccessPath | get_cost()get_interesting_order_info() | |
JoinPath | get_join_method()get_join_dist_algo() |
优化算法
索引选择和访问路径生成
优化器通过 generate_base_paths() 和专门的路径创建方法评估多个索引的访问路径:
并行执行计划
优化器确定并行度和数据分布策略:
更多详细内容请关注我的github: https://github.com/digoal/blog