首批通过分布式安全可靠测评,为关键业务系统打造
SQL 执行结果集重复
更新时间:2026-05-29 08:46
问题现象
c1,c2,c3 是索引列,当出现如下形式的表达式时,会出现结果集重复。
(c1 = x or c1 = ...) and c2 in (...) and c3 ...
关键诊断信息
触发条件
c1,c2,c3 是索引列,表达式具有以下形式。
(c1 = x or c1 = ...) and c2 in (...) and c3 ...
问题原因
举例:对于表达式 (c1 = 1 or c1 = 2) and c2 in (3,4) and c3 > 1 时,预期生成的 range 为 range(1,3,1;1,3,MAX),(1,4,1;1,4,MAX),(2,3,1;2,3,MAX),(2,4,1;2,4,MAX)。 但是在遍历到 c1 = 2 的时候,对 range graph 的状态未设置正确,导致在为 c1=2 时的 range 出错,变成了 range(1,3,1;1,3,MAX),(1,4,1;1,4,MAX),(1,3,1;2,3,MAX),(1,4,1;2,4,MAX)。这个错误的 range 会导致执行的结果集出现重复。
问题的风险及影响
SQL 执行出现正确性问题。
影响租户
影响 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)及之后版本、V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V3.2.3 BP8(oceanbase-3.2.3.3-108000062023041511)及之后版本、V3.2.4 BP3(oceanbase-3.2.4.3-103000032023041816)及之后版本、V4.1.0 BP1(oceanbase-4.1.0.0-101000052023050621)及之后版本。
规避方式
- 改索引,将 c2 或 c3 列从索引中移除。
- 改 SQL,将
c2 in (..)改为等价的 or 表达式。 - 使用
hint走主表(不推荐)。