Starrocks 中的SQL经过JOIN后,结果不对

【详述】最近业务
【背景】详见sql
【业务影响】
【StarRocks版本】2.0.0-GA
【集群规模】3fe+9be (fe与be混部)
【机器信息】16C64G
sql1:
SELECT a.msg_id ,
a.dp,
a.company_id,
a.day ,
msg_content ,
a.msg_time,
b.time_int,
diff_second,
reply_detail,
sender_type,
b.room_id
FROM
(SELECT msg_id,
dp,
company_id,
day,
diff_second,
reply_detail,
msg_time,
is_group,
rn_id
FROM dwd.dwd_crm_timeout_chat_msg_compare_middle_i_h
WHERE is_group = TRUE and reply_detail != ‘no’
and day=‘2022-02-18’ and company_id=‘W00000000001’ and rn_id like ‘%wrJawBCQAAaci3KbIX5c6Ad388oMWOKQ%’ ) a
inner JOIN
(SELECT msg_id,
dp,
company_id,
day,
msg_content,
sender_type,
room_id,
TIME_TO_SEC(date_format(msg_time, ‘%H:%i:%s’)) as time_int
FROM dwd.dwd_crm_timeout_group_chat_msg_middle_i_h
WHERE NOT is_revoke and day=‘2022-02-18’ and company_id=‘W00000000001’
and room_id=‘wrJawBCQAAaci3KbIX5c6Ad388oMWOKQ’ ) b
ON
a.company_id=b.company_id
and a.dp=b.dp
and a.msg_id=b.msg_id
AND a.day=b.day
ORDER BY a.msg_time;


join的结果不对,那么,我们将join on的条件变为
and trim(a.msg_id)=trim(b.msg_id)
相关结果就正确了。

猜想:
msg_id 作为join的条件,是否存在长度或者内容上的要求,比如不能包含空格内容?或者有长度上的要求

补充下,两个表的msg_id都是从同一个表取出来的,没有做任何操作,join会出现两条msg_id相同的数据匹配不到。或者直接指定两个表的msg_id再去join,会出现结果为空的情况

msg_id字段是什么类型,可以看下两个关联字段的字符长度是不是一样,有空格的话是不能匹配到的

bucket shuffle的BUG,我们先确认下是否是已修复的问题

小鳄鱼已经给出了方案,目前大概确定是shuffle的问题,此问题已经有了结论。

msg_id为字符串,固定格式, 均有数字字母和下划线组成,不会存在空格或其他字符。
目前测试发现,这个业务场景下的inner join 和left join 结果都有异常,分别表现为inner join的结果数据量少了,left join的结果里部分字段的值被改成了null.
改成 inner join [broadcast] , 或者 inner join [shuffle], 或者 left join [broadcast], left join [shuffle] 结果就正常了

1赞

当前这个版本建表时的分桶数和动态分区的buckets的要一致,可以规避这个问题,2.0.2我们会修复这个BUG,

1赞

ISSUE: https://github.com/StarRocks/starrocks/issues/3739