问题现象
当满足以下两个条件时,会出现 SQL 请求无法命中执行计划,并持续进行硬解析的现象:
集群已开启 SPM(SQL Plan Management)。
执行的 Prepare Statement(PS)语句中包含不可被参数化的参数。
不可参数化参数的示例:
SELECT * FROM t1 WHERE a = ? ORDER BY ?:ORDER BY子句中的参数不可参数化。SELECT * FROM t1 WHERE STR_TO_DATE(?, ?):STR_TO_DATE函数的第二个参数不可参数化。
此时,在 OceanBase 日志中会持续观察到以下错误信息:
[2025-10-14 18:10:21.173238] WDIAG [SQL] handle_physical_plan (ob_sql.cpp:5191) [1611416][T1032_L0_G0][T1032][YB420A6A256A-0006411C5D4FE330-0-0] [lt=0][errcode=-5434] fail to add spm plan to plan cache(ret=-5434)
[2025-10-14 18:10:21.173248] WDIAG [SQL] handle_ps_execute (ob_sql.cpp:2476) [1611416][T1032_L0_G0][T1032][YB420A6A256A-0006411C5D4FE330-0-0] [lt=7][errcode=-5434] fail to handle physical plan(ret=-5434)
...
[2025-10-14 18:10:21.175436] EDIAG [LIB] operator[] (ob_se_array.h:308) [1611416][T1032_L0_G0][T1032][YB420A6A256A-0006411C5D4FE330-0-0] [lt=7][errcode=-4003] idx out of range(idx=0, count_=0) BACKTRACE:0x243c5665...
[2025-10-14 18:10:21.175458] WDIAG [SQL.PC] match (ob_plan_cache_value.cpp:1654) [1611416][T1032_L0_G0][T1032][YB420A6A256A-0006411C5D4FE330-0-0] [lt=16][errcode=-4003] fail to get ps param(not_param_info_[i].idx_=1817, ret=-4003)
...
关键信息
触发条件
- 租户开启了 SPM 功能。
- 执行的 PS 语句中包含不可被参数化的参数。
事前巡检
在业务上线前,建议进行以下检查:
- 检查上线的业务中,PS 语句是否包含不可被参数化的参数。
- 确认相关租户是否开启了 SPM 功能。
事后诊断
在 OceanBase 日志中搜索以下关键字: [errcode=-4003] fail to get ps param
诊断特征:
- 日志中会先出现
-5434错误码的报错。 - 随后立即出现
-4003错误码的报错。 - 此类错误日志会大量、频繁地出现。
问题原因
在 SPM 进行计划演进的过程中,对于包含不可参数化参数的 PS 语句,Plan Cache 所依赖的部分状态信息未能被正确设置。这导致该 SQL 的执行计划在尝试加入 Plan Cache 时失败,并报错 -4003。
Plan Cache 在处理此错误时,会清理该 SQL ID 对应的整个 Cache Node。其后果是,该 SQL 对应的物理计划始终无法成功加入 Plan Cache,每次执行都需要进行硬解析。
问题风险及影响
- 性能影响:在开启 SPM 的集群中,包含不可参数化参数的 PS 语句将无法使用 Plan Cache,导致每次请求都需要硬解析。不过,此类语句在生产环境中通常较少,对整体系统性能影响有限。
- 日志影响:日志中会频繁打印
-4003错误信息。
影响范围
影响租户
| 租户模式 | 是否受影响 |
|---|---|
| SYS 租户 | 是 |
| MySQL 租户 | 是 |
| Oracle 租户 | 是 |
影响版本
| 影响版本 | 开始版本 | 修复的 BP 版本 | (区间内)修复的 Hotfix 版本 |
|---|---|---|---|
| 4.2.5 | 4.2.5.5-BP5-105000052025070822 | 4.2.5.7-BP7-107000092025103121 | 4.2.5.6-BP6 hf2-106020012025102316, 4.2.5.6-BP6 hf3-106030012025112319, 4.2.5.6-BP6 hf4-106040012026033011 |
| 4.2.1 | 4.2.1.11-BP11 hf5-111050022025071110 | ||
| 4.3.5 | 4.3.5.3-BP3-103000102025071821 | 4.3.5.5-BP5-105000212025111617 | |
| 4.4.x LDS | 4.4.0.0-Beta-100000562025070723 |
解决方案
- 绑定 Outline:为受影响的 PS 语句绑定 Outline,以规避 SPM 对该语句的计划演进。绑定 Outline 后,该语句的执行计划可以正常加入 Plan Cache。
- 升级版本:将 OceanBase 内核升级至已修复该问题的版本。
规避方案
为出现问题的 PS 语句绑定 Outline,使其不参与 SPM 的计划演进过程。绑定 Outline 后,该语句的执行计划即可正常加入 Plan Cache,从而避免硬解析。