问题现象
当执行计划存在抽取 CTE 使用 temp table,且该 temp table 的数据源是一个分布式计划、数据量超过 90W 行,则会触发 500 租户内存泄漏。
关键诊断信息
触发条件
当执行计划存在抽取 CTE 使用 temp table,且该 temp table 的数据源是分区表、数据量超过 90W 行。
事前巡检
定期检查 500 租户内存。
通过 plan_cache_plan_explain 检查是否存在
PHY_TEMP_TABLE_TRANSFORMATION、PHY_VEC_TEMP_TABLE_TRANSFORMATION算子,然后查看这些 Plan 对应的 SQL,看是否有分布式的 temp table 计划,并且 temtable 数据超过 90W 行。
事后诊断
通过 plan_cache_plan_explain 检查是否存在 PHY_TEMP_TABLE_TRANSFORMATION、PHY_VEC_TEMP_TABLE_TRANSFORMATION 算子,通过 memleak 抓堆栈,或者通过日志分析 500 租户内存分析栈。
问题原因
当执行计划存在抽取 CTE 使用 temp table,且该 temp table 的数据源是分区表、数据量超过 90W 行时,PX 执行中有一个 SeArray 变量会触发扩容,但是扩容后的内存没有释放。
问题的风险及影响
500 租户内存泄漏。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V3.2.3 GA(oceanbase-3.2.3.0-20220419)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本、V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本、V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)及之后版本、V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本、V4.2.2 GA(oceanbase-4.2.2.0-100000082024011317)及之后版本、V4.2.5 GA(oceanbase-4.2.5.0-100000082024102022)及之后版本、V4.3.0(oceanbase-4.3.0.0-100000072024020200)及之后版本、V4.3.5 GA(oceanbase-4.3.5.0-100000232024123020)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.2.5 BP4(oceanbase-4.2.5.4-104000082025052817)及之后版本、V4.3.5 BP1 Hotfix6(oceanbase-4.3.5.1-101060022025052114)、V4.3.5 BP2(oceanbase-4.3.5.2-102000162025051417)及之后版本。
重启 OBServer。
规避方式
通过隐藏配置项控制 CTE 全部展开:
alter system set _with_subquery=2;。通过 OPT_PARAM Hint(指定在查询级别更新一些优化器相关的配置项/系统变量):
/*+ OPT_PARAM('_with_subquery', '2') */。