为何query_parallelism会影响Ignite中两个UUID列的关联查询结果
问题根因
- 该问题是Apache Ignite 2.10.0版本的已知缺陷,触发条件为
query_parallelism>1且关联的两张表未配置亲和键绑定。 - Ignite的
query_parallelism参数用于控制单表查询的并行分片数量,参数值大于1时,SQL查询会拆分为多个独立的分片任务,每个任务仅处理表中部分分区的数据。 - 测试中的两张表未配置亲和键关联,关联字段
source_id和id的数据分布不存在分区对齐规则。当query_parallelism=1时,查询仅生成一个分片,会扫描两张表的全量分区数据,因此可以正常匹配到关联结果。 - 当
query_parallelism=8时,每个分片任务默认只会匹配同个分片范围内的两张表的分区数据,由于关联字段的对应值不在同一个分片对应的分区范围内,所有分片都无法匹配到结果,最终返回空集。
修复方案
- 优先升级Ignite版本至2.12及以上,该版本已经修复了无亲和键关联表在多并行度下join结果为空的逻辑缺陷。
- 若暂时无法升级版本,可以为两张表配置亲和键关联:将
source_ml_blue表的亲和键设置为source_id,关联到source_nprobe_tcp_blue表的id字段,保证关联字段相同的值落在同一个分区,即可在多并行度下正常返回结果。 - 临时验证可使用广播join的查询hint,强制小表全量广播到所有分片进行匹配,示例语句如下:
SELECT _A."id" AS "_A_id", _A."source_id" AS "_A_source_id", _B."id" AS "_B_id", _B."flx_src_ip_text" AS "_B_src_ip" FROM PUBLIC."source_ml_blue" AS "_A" INNER JOIN /*+ BROADCAST */ PUBLIC."source_nprobe_tcp_blue" AS "_B" ON "_A"."source_id"="_B"."id";
内容的提问来源于stack exchange,提问作者C.Vergnaud
相关产品推荐
相关产品推荐

