基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
index skip scan 查询出现正确性问题
更新时间:2026-05-22 08:56
问题现象
查询走 index skip scan 并行计划时,查询结果不对。和通过指定 index(table primary) 走主表扫描结果不一致。
问题原因
skip scan 是通过索引前缀跳跃扫描的,比如索引 index(c1,c2,c3) 查询 select * from t1 where c2=1,c1 的唯一值比如有 1 2 3,实现上首先是读 c1 的唯一值,和 c2=1 一起定位扫描,如果并行查询拆分出多个查询 range,这里当前实现忽略了 c3 列的值,c3 列会设置成 min 到 max,会扫到和前后 range 重叠的部分数据。比如当前数据分布是:
1 1 1
1 1 2
2 1 3
2 1 4
2 1 5
3 1 5
并行执行拆分出 2 个子 range:(min:2,1,4],(2,1,4:max),(c1,c2)=(2,1) 这一值跨了 2 个 range,那么对于第一个 range 会读到 c1=2 这个唯一值,拼接 c2=1 生成查询 range:(2,1,min : 2,1,max) 会扫到 2 1 5 这行数据,但这行数据实际是在第 2 个range,因此重复扫数据。
问题的风险及影响
查询出现正确性问题,查询结果偏多。
影响版本
OceanBase 数据库 V4.1.0 BP3 Hotfix1(oceanbase-4.1.0.2-103010012023082514)及之前版本,V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)版本。
解决方法及规避方式
解决方法
升级到问题已修复的版本,目前已修复的版本包含 OceanBase 数据库 V4.1.0 BP3 Hotfix2(oceanbase-4.1.0.2-103020012023090809)、V4.2.0 Hotfix1 及之后版本。
通过如下方式绕过 index skip scan 计划。
- index skip scan 计划要求是比较严格,但可能统计信息不准导致误走到 index skip scan 计划,可以收集统计信息确认。
- 对于走了index skip scan 的计划,可以通过 index(表名 primary) 强制走全表扫,不走 index skip scan 规避方式。
- 查看 index skip scan 使用的索引,可以选择禁用索引或者调整索引,删掉包含的查询列来避免 index skip scan 计划。
规避方式
受影响的版本没有直接的规避方式,不过出现问题的场景基本上是统计信息不准导致误走到 index skip scan 计划,所以可以保持定期收集统计信息,避免误生成 index skip scan 计划。