Doris Join优化实践

Doris Join优化实践

问题

 with t1 as (
    select *
    from dor_alive_user_all_rt
    where app_id = 'xxx'
        and alive_id = 'xxxx'
),
t2 as (
    select *
    from dor_t_users_full_rt
    where app_id = 'xxx'
)
select 
t1.app_id,
    t1.alive_id,
    t2.user_id,
    t2.wx_name,
    t2.phone
from t1
     join t2 on t1.app_id = t2.app_id
    and t1.user_id = t2.user_id;

上面的SQL,t1表2条数据,t2表56万条数据

如果是t1 left join t2,时间是2.8s,如果是t1 join t2,时间是0.4s,如果是t2 right join t1,时间则不到30ms,为什么三种Join写法会有三个不同的执行时间呢,接下来我们一起仔细探究其中的差别。

原因

  • t1 left join t2:由于右表过大,表扫描时无法构建runtime filter,因此这个过程是2条数据去 Join 56万条数据,速度很慢。
    在这里插入图片描述
    上图可以看到,Join的过程也没有使用runtime filter。

  • t1 join t2:执行计划如下,扫描时对t1表构建runtime filter,但是由于t1表通过alive_id就可以剔除所有不符合的数据,因此这部分优化没有效果。此外,1:VOlapScanNode的结果是56万条数据。真正让它速度变快的是在Hash Join的时候对t2表使用了runtime filter,原本t2表是56万条数据,runtime filter之后只剩2条数据,因此Hash Join的速度变快了。
    在这里插入图片描述

  • t2 right t1:执行计划如下,扫描时对t2表使用了runtime filter,使得结果数据只有两条,因此两个ScanNode的结果都是两条数据,这样Hash Join的速度就很快了,因此整体速度只需几十毫秒。
    在这里插入图片描述
    此外,上面的SQL还可以这么写:

 with t1 as (
    select *
    from dor_alive_user_all_rt partition(p_78)
    where app_id = 'appAKLWLitn7978'
        and alive_id = 'l_63da0da0e4b0fc5d122b2470'
),
t2 as (
    select *
    from dor_t_users_full_rt partition(p_78)
    where app_id = 'appAKLWLitn7978'
)
select   /*+SET_VAR(enable_cost_based_join_reorder=true) */
t1.app_id,
    t1.alive_id,
    t2.user_id,
    t2.wx_name,
    t2.phone
from t1
join t2 on t1.app_id = t2.app_id
    and t1.user_id = t2.user_id;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值