GBase 8a
性能调优
文章

GBase 8a 做大表 JOIN,不怕表大,怕的是中间结果太大

发表于2026-03-20 09:47:0118次浏览3个评论

在分析型场景里,很多 SQL 慢,并不是因为表太大,而是因为 JOIN 之前没把数据量压下来,导致中间结果膨胀得太快。这个问题在宽表、日志表、订单明细表这类场景里很常见。

比如下面这种 SQL:

 

select a.order_id, a.user_id, b.region_name
from fact_order a
join dim_region b
  on a.region_id = b.region_id
where a.stat_date = '2026-03-18';

 

这条本身不算复杂,但如果 fact_order 很大,而筛选条件又不够早地下推,实际参与 JOIN 的数据可能还是很多。更麻烦的是,有些人还会顺手写成:

 

select *
from fact_order a
join dim_region b
  on a.region_id = b.region_id
where a.stat_date = '2026-03-18';

 

这就更容易把中间结果做大。分析型数据库里,select * 往往是个危险习惯,尤其 JOIN 场景下,字段一多,传输、排序、聚合、落盘都会跟着变重。

更稳一点的思路通常是两步:
先尽量过滤掉不需要的数据,再做关联;
同时只取真正要用的列,别把整行都拖进来。

比如:

 

select a.order_id, a.user_id, b.region_name
from (
    select order_id, user_id, region_id
    from fact_order
    where stat_date = '2026-03-18'
      and order_status = 1
) a
join dim_region b
  on a.region_id = b.region_id;

 

这样写不一定永远最优,但思路是对的:先缩小参与 JOIN 的数据,再去做关联。

评论

登录后才可以发表评论
用户头像
山佳发表于 4个月前
学习了
爱笑的眼睛发表于 2个月前
谢谢分享
用户头像
山佳发表于 2个月前
来了