首批通过分布式安全可靠测评,为关键业务系统打造
优化器主动抽取 CTE 导致执行计划走偏,查询语句超时
更新时间:2026-05-26 09:46
适用版本
OceanBase 数据库 V3.x 版本。
问题现象
如下查询语句在 OceanBase 数据库 V3.x 版本执行超时,在 V2.2.77 版本正常执行。
SELECT * FROM (
SELECT * FROM WF_H_PROCESSINST
UNION ALL
SELECT * FROM WFPROCESSINST
) START WITH PROCESSINSTID = xxx
CONNECT BY PRIOR PARENTPROCID = PROCESSINSTID
ORDER BY LEVEL DESC;
V3.x 版本执行计划:

V2.2.77 版本执行计划:

问题原因
通过执行计划可以看到 V3.x 版本上引入了 TEMP TABLE TRANSFORMATION 算子,主要是因为控制优化器主动抽取 CTE 子句,导致执行计划发生变化,查询 SQL 命中了此优化场景的 bad case。
解决方法
方法一:在查询语句中添加 Hint,示例通过绑定 outline 解决。
SELECT /*+no_rewrite*/ * FROM (
SELECT * FROM WF_H_PROCESSINST
UNION ALL
SELECT * FROM WFPROCESSINST
) START WITH PROCESSINSTID = xxx
CONNECT BY PRIOR PARENTPROCID = PROCESSINSTID
ORDER BY LEVEL DESC;
方法二:OceanBase 数据库 V3.2.3 BP9 及之后版本,通过关闭租户隐藏参数 _xsolapi_generate_with_clause 关闭 CTE 抽取优化。
obclient> alter system set "_xsolapi_generate_with_clause"=0;