基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
Batch NLJ+except op 正交导致查询结果错误
更新时间:2026-05-14 07:41
问题现象
存在查询结果错误等正确性问题。
关键诊断信息
事后诊断
执行计划里存在 NLJ, NLJ 走 Batch Rescan,并且 NLJ 算子的右支子计划存在 except 算子,或者用户 SQL 里存在 except 或者 minus 等用法。

问题原因
走到 Batch NLJ+except op 正交逻辑上时,如果第一行数据在 except 的所有 child 中都同时不存在数据,则逻辑上两个迭代器都为空,但 except op 的特殊在于当第一个 child 的迭代器为空时,就不会再去迭代第二个 child,这里就对第二个迭代器产生了短路效应,因此第二个迭代器在第一次 group rescan 的时候并没有被真正初始化。 当 NLJ 用第二行数据去 Rescan 时,期望的是对 NLJ 的右支都进行切迭代器动作,由于 except 的第二个迭代器第一次 Rescan 因为短路没有被初始化,所以切迭代器的流程中认为结果为空(实际上没有执行真正的 Rescan 动作),将 iter_end_ 标记为 true,所以不会有数据返回。
问题的风险及影响
可能会带来正确性问题。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响版本
OceanBase 数据库企业版 V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本、V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.2.1 BP2(oceanbase-4.2.1.2-102010012023120119)及之后版本。
规避方式
NLJ Batch 优化关掉:set global _nlj_batching_enabled=false;。