OceanBase 4.3 MySQL 租户下 OUTLINE 绑定执行计划,指定索引后依然走全表扫描?

环境信息:

  • OceanBase 版本:社区版 4.2.x 或 4.3.x(选你实际用的)
  • 租户模式:MySQL 模式
  • 部署方式:单机或三副本均可

问题描述:

遇到一个比较诡异的执行计划问题。有一条核心查询 SQL,在某张大表(千万级数据量)上原本走索引 A,查询响应在几十毫秒。但最近业务数据倾斜或统计信息变化后,优化器突然改走全表扫描,耗时飙升到几秒甚至超时。

尝试用 CREATE OUTLINE 手动绑定执行计划,强制指定走索引 A。OUTLINE 创建成功,查 DBA_OB_OUTLINES 也能看到记录。但重新执行 SQL,用 EXPLAIN 看执行计划,依然走的是全表扫描 ,OUTLINE 完全没有生效。

已经尝试过的排查:

  1. 确认 SQL 文本与 OUTLINE 中绑定的文本完全一致(包括空格、大小写)。
  2. 检查 enable_use_outline 参数,确认是开启状态。
  3. 尝试用 /*+ INDEX(表名 索引名) */ 这种 Hint 方式直接写在 SQL 里,Hint 是可以生效的 ,说明索引本身没问题,SQL 写法也没错。
  4. 但一旦改用 OUTLINE 绑定,就不行。

核心疑问:

  • OceanBase 的 OUTLINE 机制和 Oracle 的 SQL_PROFILE /PLAN_BASELINE 有什么核心差异?为什么 Hint 生效但 OUTLINE 不生效?
  • 有没有可能 OUTLINE 匹配 SQL 文本时对某些参数化查询或预处理语句有特殊要求?我的 SQL 里带有 ? 占位符,是 PreparedStatement 发出的。
  • 如果 OUTLINE 这条路走不通,在 OceanBase 生产环境里,有没有比 Hint 更优雅的固定执行计划方案?比如 SQL Plan Baseline 功能在 OB 里是否可用?

你已经很多天 以这样的方式 刷积分了 不要觉得别人看不出来 如果再这样禁言