OceanBase 执行计划缓存(Plan Cache)的淘汰机制,以下描述正确的是?

OceanBase 执行计划缓存(Plan Cache)的淘汰机制,以下描述正确的是?

A. Plan Cache 使用 LRU(Least Recently Used)算法淘汰执行计划,当缓存满时,最久未使用的计划会被优先淘汰。

B. 执行计划缓存的大小由租户级参数 ob_plan_cache_percentage 决定,表示可用内存的百分比,当缓存使用率超过该阈值时,会触发计划淘汰。

C. 当表发生 Schema 变更(如加列、删列、加索引)后,所有引用该表的执行计划会立即从 Plan Cache 中被标记为失效并删除。

D. 绑定 Outline 的执行计划会被锁定在 Plan Cache 中,永远不会被淘汰,以保证关键业务的计划稳定性。

3 个赞

解析
Plan Cache 的大小由租户参数 ob_plan_cache_percentage (默认值为 5)控制,表示占租户可用内存的百分比。当 Plan Cache 实际使用内存超过该阈值时(或接近上限),系统会触发内存淘汰,选择部分计划释放内存。

  • A 错误 :OceanBase Plan Cache 的淘汰算法并非 LRU,而是一种优先级 + 访问频率 的混合策略(类似 LFU 的变种),还会考虑计划大小、编译代价等因素。容易误记为 LRU,这是常见干扰项。
  • B 正确 :淘汰由内存阈值触发,ob_plan_cache_percentage 就是控制 Plan Cache 占租户内存的比例上限。
  • C 错误 :Schema 变更后,相关计划不是“立即删除”,而是被标记为无效 。新的查询不会命中这些计划,但已有的正在执行计划可能继续完成。缓存的无效计划会逐步在后续淘汰中被清理,而不是瞬时全部删除。
  • D 错误 :Outline 绑定的计划不会永久锁定在 Plan Cache 中 。Outline 的作用是让优化器选择特定的计划,但该计划仍然会参与正常的 Plan Cache 淘汰流程。如果该计划很少使用,一样可能被淘汰,下次执行时重新生成。这里容易混淆 Outline 的绑定作用与缓存的持久性。
2 个赞

正确答案:B

2 个赞

正确答案:A、B、C

选项 A(正确)
OceanBase 的 Plan Cache 采用 LRU(最近最少使用)淘汰策略,当缓存内存达到高水位时,会优先淘汰最久未被使用的执行计划,直到内存降至低水位线。
选项 B(正确)
执行计划缓存的内存上限由租户级参数 ob_plan_cache_percentage 控制(表示可用内存的百分比),当缓存使用率超过该阈值(触发高水位)时,会启动淘汰流程。
选项 C(正确)
当表发生 Schema 变更(如加列、删列、加索引)时,所有引用该表的执行计划会被立即标记为失效并从 Plan Cache 中删除,避免使用旧计划导致执行错误。

选项 D(错误)
绑定 Outline 的执行计划仅能保证 SQL 优先使用指定计划,但仍会参与 Plan Cache 的淘汰机制,并非 “永远不会被淘汰”,不存在永久锁定的机制。

2 个赞

选哪个?

1 个赞

ABC

1 个赞

AC

A. OBCA原文:“优先淘汰最久没被使用的执行计划”
B. 开始淘汰是由高水位参数 ob_plan_cache_evict_high_percentage控制的。
C. OBCA原文:“SQL 中涉及表的 Schema 变更时(比如添加索引、删除或增加列等),该 SQL 在计划缓存中所对应的执行计划将被刷新。”
D. 无任何证据证明这个事。理论上也不合理,outline绑定了不代表最近一直在用。如果大量最近没用的强制占着plan cache肯定是不合理的。