首批通过分布式安全可靠测评,为关键业务系统打造
in 优化 query range 抽取有问题导致查询结果不一致
更新时间:2026-05-26 09:46
问题现象
命中索引且含 in expr 时,在特定的场景下会导致查询返回的结果集不对。出现该 BUG 需满足 WHERE 条件中含 4 个及以上索引列,且:
第一个列是等值谓词。
第二个列是范围谓词。
第三个列是 in 表达式。
第四个列是任意谓词。
其中,第 1 个条件可是 1 或多个等值谓词,第 2 个条件后也可跟着 0 或多个等值谓词。 例如,表 t1 在 c1,c2,c3,c4 列上构建了索引,当查询条件为 c1 = 1 and c2 >= 1 and c2 <= 10 and c3 in (1,2,3) and c4 = 1 时,没有对返回的结果集按 c2 >= 1 and c2 <= 10 进行过滤,导致出现正确性问题。
关键诊断信息
触发条件
WHERE 条件中含 4 个及以上索引列,且:
第一个列是等值谓词。
第二个列是范围谓词。
第三个列是 in 表达式。
第四个列是任意谓词。
其中,第 1 个条件可是 1 或多个等值谓词,第 2 个条件后也可跟着 0 或多个等值谓词。 例如,表 t1 在 c1,c2,c3,c4 列上构建了索引,当查询条件为 c1 = 1 and c2 >= 1 and c2 <= 10 and c3 in (1,2,3) and c4 = 1 时,没有对返回的结果集按 c2 >= 1 and c2 <= 10 进行过滤,导致出现正确性问题。
问题原因
对于 c1 = 1 and c2 >= 1 and c2 <= 10 and c3 in (1,2,3) and c4 = 1,优化器会认为 c1,c2 列的表达式能抽出精确的 range,因此把 c1,c2 列相关的表达式从 filter 中移除了,实际上只抽取了 c1 列上的 range,从而导致结果集出错。

问题的风险及影响
正确性问题。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响的版本
OceanBase 数据库企业版 V3.2.3 GA(oceanbase-3.2.3.0-20220419)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V3.2.3 BP7 Hotfix2(oceanbase-3.2.3.3-107020062023022810)、V3.2.3 BP7 Hotfix3(oceanbase-3.2.3.3-107030052023031712)、V3.2.3 BP7 Hotfix4(oceanbase-3.2.3.3-107040032023032910)、V3.2.3 BP7 Hotfix5(oceanbase-3.2.3.3-107050022023040817)、V3.2.3 BP7 Hotfix6(oceanbase-3.2.3.3-107060012023041113)、V3.2.3 BP8(oceanbase-3.2.3.3-108000062023041511)及之后版本、V3.2.4 BP2(oceanbase-3.2.4.7-107000012023113010)及之后版本。
改写 SQL,将 in 表达式改为等价的 or 表达式。
改索引或加索引,使得命中索引的谓词不满足上述 4 个条件之一。
规避方式
改写 SQL,将 in 表达式改为等价的 or 表达式。
改索引或加索引,使得命中索引的谓词不满足上述 4 个条件之一。