GBase 8a
性能调优
文章

避免对HASH分布列做计算或使用函数

发表于2024-12-11 09:53:5446次浏览1个评论

 hash分布列尽量不要参与函数运算,否则就用不上HASH分布,而是需要重新拉表。
例1
表结构:
create table g_00pf_ebank_tran_cust_sum_bk160122
(dte varchar(8),
pid varchar(16),
......
......
)distributed by ('pid');
create table g_00pf_ebank_tran_cust_sum
(dte varchar(8),
pid varchar(16),
......
......
)distributed by ('pid');
优化前:
insert into g_00pf_ebank_tran_cust_sum_bk160122
 select dte, 
        ifnull(pid, 'x'),
        ……
        ……
   from g_00pf_ebank_tran_cust_sum;
优化后:
insert into g_00pf_ebank_tran_cust_sum_bk160122
 select dte, 
        pid,

 .. .. ..
   from g_00pf_ebank_tran_cust_sum
  where pid is not null;
insert into g_00pf_ebank_tran_cust_sum_bk160122
 select dte, 
        'x',
        .. .. ..
   from g_00pf_ebank_tran_cust_sum
  where pid is null;
例2
select count(1)
 from (SELECT to_char(ZLBSCJUUID), UUID, EWBHXH
         FROM ZBQ_FFK_HXZG_GDDS.SB_CWBB_XQYKJZZ_ZCFZB
        GROUP BY to_char(ZLBSCJUUID), UUID, EWBHXH) t

ZBQ_FFK_HXZG_GDDS.SB_CWBB_XQYKJZZ_ZCFZB是以ZLBSCJUUID字段进行hash分布的,数据量是182948288
SQL执行耗时12.48秒
ZLBSCJUUID的字段类型是varchar(32),to_char以后字段值没有发生任何变化。
如果去掉to_char函数改写成:

select count(1)
 from (SELECT ZLBSCJUUID, UUID, EWBHXH
         FROM ZBQ_FFK_HXZG_GDDS.SB_CWBB_XQYKJZZ_ZCFZB
        GROUP BY ZLBSCJUUID, UUID, EWBHXH) t

去掉to_char函数改写后的SQL执行耗时4.72秒,性能提升近2倍。

评论

登录后才可以发表评论
用户头像
山佳发表于 2个月前
学习了