首批通过分布式安全可靠测评,为关键业务系统打造
相同 SQL 生成不同 SQL_ID,未命中执行计划的原因和解决方法
更新时间:2025-06-12 08:36
问题现象
SQL 执行慢,每条 SQL 都执行了硬解析,从 gv$ob_sql_audit 中查看执行记录,发现每条 SQL 的 SQL_ID 都不一样,并且未命中执行计划。

问题原因
错误设置
cursor_sharing(用于判断处理 SQL 时是否进行参数化)变量为EXACT,导致每次 SQL 都不做参数化。ps 语法,SQL 未进行参数化,导致每次都硬解析。
代码中使用了 ps 语法,并且直接拼接了 SQL,并未用参数模版的方式(cursor_sharing 设置为 EXACT),导致传入的 SQL 无法参数化,本地测试如下图所示。

可以看到每次 SQL_ID 不同,并且 IS_HIT_PLAN 字段都为 0,如下图所示。

影响版本
OceanBase 数据库所有版本。
解决方法
SQL 使用参数化模版,即设置 cursor_sharing 为默认值 FORCE。