基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
使用并行执行 group by 查询结果中出现重复行
更新时间:2026-05-26 09:46
问题现象
在使用并行执行 group by c1 查询结果中出现了重复的 c1 值。
关键诊断信息
触发条件
查询一张 range 分区表。、
表上建了 local 索引。
group by 索引键,利用上索引的序,也就是生成了 merge group by 算子。
并行度大于 1,并且生成的是
granule block iterator而不是granule partition iterator。
问题原因
原因是原来并行查询 range 分区只能说出 granule partition iterator,以分区为单位划分任务,在并行度大于分区数时,大量 PX 线程分不到任务。后来做了优化,允许生成 granule block iterator,这要求一个分区内划分的多个 block 是要有序的。 granule block iterator 利用 query range 生成总的任务,然后切分成若干个任务,如果 query range 不是有序的,那么任务就不是有序的,最终输出结果也不是有序的,那么上层 merge group by 的结果中就会出现重复值。
问题的风险及影响
出现正确性问题。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响版本
OceanBase 数据库 V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法
修改并行度为 1。
使用
hint指定走hash而不是merge group by。改表结构,不用
range分区。
规避方式
在插入 range 分区时,设置并行度为 1。