OceanBase源码学习: 2.4 计划缓存与执行器
OceanBase源码学习: 2.4 计划缓存与执行器
计划缓存和执行器系统负责管理 OceanBase 中已编译好的 SQL 执行计划的缓存、检索和执行。该系统通过存储常用的执行计划以避免重新编译来优化 SQL 性能,同时还处理 SQL 参数化,以最大限度地提高类似查询的计划重用。
系统概述
计划缓存是已编译好的执行计划的中央存储库,它实现了一套复杂的缓存策略,包括 SQL 参数化、plan 验证和自动驱逐。系统通过维护一个可重用的物理计划池来弥补查询编译和执行之间的差距。
核心架构
计划缓存结构
计划缓存实现了分层结构,以便根据 SQL pattern 和参数类型有效地组织和检索缓存中的计划。
缓存层次结构
关键组件
ObPlanCache | ||
ObPlanCacheKey | ||
ObPCVSet | ||
ObPlanCacheValue | ||
ObPlanSet | ||
ObPhysicalPlan |
SQL 参数化
SQL 参数化对于计划重用至关重要,将 SQL 语句中的文字值转换为参数,以使多个类似的查询共享相同的执行计划。
参数化过程
参数化规则
系统采用复杂的规则(rule)来确定哪些常量可以安全地参数化:
可参数化: WHERE子句中的简单文字、INSERTvalues不可参数化: ORDER BY位置中的常量、LIMIT子句、需要指定类型的函数参数上下文相关:聚合函数中的常量、时间表达式
计划的检索和验证
计划缓存实现了多阶段验证过程,以确保缓存的计划保持有效并与当前执行上下文兼容。
计划的查找流程
计划的验证检查
系统在返回缓存计划之前执行多项验证检查:
check_schema_version() | ||
match_params_info() | ||
match_priv_cons() | ||
match_variable_meta() | ||
is_expired() |
计划执行模式
OceanBase 支持不同的执行模式,这些模式会影响计划的缓存和执行方式。
执行模式
计划驱逐和内存管理
计划缓存实现了复杂的内存管理,以在内存压力下保持最佳性能。
驱逐策略
计划统计信息以及自适应管理
系统跟踪每个计划的详细统计数据,以告知缓存用于决策后续动作:
hit_count_ | ||
execute_times_ | ||
elapsed_time_ | ||
cpu_time_ | ||
rows_processed_ | ||
last_active_time_ |
与 SQL 处理管道集成
计划缓存与更广泛的 SQL 处理管道无缝集成,充当了查询编译器和执行器之间的桥梁。
SQL 处理集成
计划缓存和执行系统是关键的性能优化组件,它通过全面的验证机制,减少 SQL 编译开销,同时确保执行的正确性。其先进的参数化和缓存策略,可实现不同工作负载的高性能查询处理。
更多详细内容请关注我的github: https://github.com/digoal/blog