首批通过分布式安全可靠测评,为关键业务系统打造
专有云生产环境范围查询结果集错误及 Query Range 抽取问题分析与解决
更新时间:2026-05-14 09:21
问题现象
在 OceanBase 数据库中,当执行带有范围查询条件的 SQL 语句时,结果集中缺失了特定日期的第一天的数据,而后续日期的数据则是正确的。例如,对于日期范围 1 月 1 日至 1 月 2 日的查询,1 月 1 日的数据未能正确返回,但 1 月 2 日的数据却能正常显示。
SELECT * FROM table_name WHERE A.D_BIZ BETWEEN '2023-01-01' AND '2023-01-02' AND (A.C_PA_CODE = 'LXSR_ZQ' OR (A.C_PA_CODE = 'TZSY_ZZS_CD' AND A.C_PI_CODE = 'ZZS_XX_LX'));
关键诊断信息
触发条件
存在复合索引
(c1, c2, c3)。过滤条件为
c1 BETWEEN 1 AND 2 AND (c2 = 1 OR (c2 = 2 AND c3 = 3))。索引列
c1, c2之间可以有其他列,且这些列上存在等值谓词。
事前巡检
检查涉及范围查询的 SQL 语句,特别是那些使用了复合索引并且过滤条件中包含了
BETWEEN和OR组合的 SQL。审核索引设计,确保索引列的顺序不会导致 Query Range 抽取错误。
事后诊断
对比范围查询和等值查询的结果集,检查是否存在特定日期的数据缺失。
查看 SQL 执行计划,确认 Query Range 的抽取是否符合预期。
问题原因
旧版 Query Range 抽取的逻辑存在缺陷,在合并 Range Node 时处理不当,导致在过滤条件满足特定场景时,抽取的 Range 出现错误。这使得某些本应被查询出来的记录未能出现在结果集中,从而影响了 SQL 查询的正确性。
问题的风险及影响
SQL 结果可能错误,特别是在执行带有范围查询条件的 SQL 语句时,可能导致数据缺失,进而影响业务逻辑的准确性。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.2 GA(oceanbase-3.2.2-20211130225726)及之后版本、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.4.0(oceanbase-4.4.0.0-100000562025070723)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V4.2.2(oceanbase-4.2.2.0-100000082024011317)及之后的版本,使用新版 Query Range 逻辑避免此问题。
通过 Hint 绑定其他索引来应急处理。
规避方式
修改索引中列的顺序,确保在过滤条件中使用
BETWEEN和OR组合时,Query Range 能够正确抽取。在不影响业务的前提下,考虑将范围查询条件改为等值查询条件,以规避此问题。