环境信息:
- OceanBase 版本:社区版 4.2.x 或 4.3.x(选你实际用的)
- 租户模式:MySQL 模式
- 部署方式:单机或三副本均可
问题描述:
遇到一个比较诡异的执行计划问题。有一条核心查询 SQL,在某张大表(千万级数据量)上原本走索引 A,查询响应在几十毫秒。但最近业务数据倾斜或统计信息变化后,优化器突然改走全表扫描,耗时飙升到几秒甚至超时。
尝试用 CREATE OUTLINE 手动绑定执行计划,强制指定走索引 A。OUTLINE 创建成功,查 DBA_OB_OUTLINES 也能看到记录。但重新执行 SQL,用 EXPLAIN 看执行计划,依然走的是全表扫描 ,OUTLINE 完全没有生效。
已经尝试过的排查:
- 确认 SQL 文本与 OUTLINE 中绑定的文本完全一致(包括空格、大小写)。
- 检查
enable_use_outline参数,确认是开启状态。 - 尝试用
/*+ INDEX(表名 索引名) */这种 Hint 方式直接写在 SQL 里,Hint 是可以生效的 ,说明索引本身没问题,SQL 写法也没错。 - 但一旦改用 OUTLINE 绑定,就不行。
核心疑问:
- OceanBase 的 OUTLINE 机制和 Oracle 的
SQL_PROFILE/PLAN_BASELINE有什么核心差异?为什么 Hint 生效但 OUTLINE 不生效? - 有没有可能 OUTLINE 匹配 SQL 文本时对某些参数化查询或预处理语句有特殊要求?我的 SQL 里带有
?占位符,是 PreparedStatement 发出的。 - 如果 OUTLINE 这条路走不通,在 OceanBase 生产环境里,有没有比 Hint 更优雅的固定执行计划方案?比如 SQL Plan Baseline 功能在 OB 里是否可用?