GBase 8a
性能调优
文章

SQL优化案例-关联顺序优化

发表于2024-11-20 15:20:5169次浏览4个评论

优化原因:用户编写SQL语句的JOIN顺序可能不是最优,导致查询性能较低。

SQL特征:

1、语句包含多个LEFT JOIN

2、多个LEFT JOIN的ON条件均为t1.colX = tn.colX

如:select x1.* from x1 

    left joinx2 on x1.many_duplicate_value = x2.many_duplicate_value 

    left join x3 on x1.no_duplicate_value = x3.no_duplicate_value

    left join x4 on x1.hash_col = x4.hash_col;

优化场景:

语句特征满足上面的特征描述。

LEFT JOIN的右表,一些表可以直接与左表形成Hash JOIN关系,一些表可能会导致左表发生膨胀。

优化效果:

让形成Hash JOIN关系的LEFT JOIN先执行,避免拉表。

例如SQL特征中描述的语句,因为left join x4 on x1.hash_col = x4.hash_col是Hash分布式JOIN,因此可以提到最前面,直接分布式执行。

让膨胀率小的LEFT JOIN先执行,减小拉表数据量。

如果参与JOIN条件的列的值的重复度较高,则很可能会造成LEFT JOIN结果发生膨胀。一般来说,使用主键列参与的JOIN条件,膨胀率是最小的;而重复值越多的列,膨胀率就越可能高。

例如SQL特征中描述的语句,因left join x3 on x1.no_duplicate_value = x3.no_duplicate_value对x1的膨胀率比left join x2 on x1.many_duplicate_value = x2.many_duplicate_value小,因此可以把left join x3提到left join x2前面。

通过这种调整,避免对膨胀后的数据拉表,减小了拉表数据量。

示例语句
select x1.* from x1 

left joinx2 on x1.many_duplicate_value = x2.many_duplicate_value 

left join x3 on x1.no_duplicate_value = x3.no_duplicate_value

left join x4 on x1.hash_col = x4.hash_col;

改写后语句

select x1.* from x1 

left join x4 on x1.hash_col = x4.hash_col;

left join x3 on x1.no_duplicate_value = x3.no_duplicate_value

left joinx2 on x1.many_duplicate_value = x2.many_duplicate_value 

注:因x1.hash_col = x4.hash_col使用Hash分布列,因此left join x4调整到第1个位置;因x1.no_duplicate_value = x3.no_duplicate_value的膨胀率比x1.many_duplicate_value = x2.many_duplicate_value的膨胀率低,因此把left join x3调整到left join x2之前。

评论

登录后才可以发表评论
用户头像
levvel发表于 5个月前
文笔太棒了!
崔哥发表于 2个月前
红满苔阶绿满枝,杜宇声声,杜宇声悲!交欢未久又分离,彩凤孤飞,彩凤孤栖。别后相思是几时,后会难知,后会难期。此情何以表相思,一首情词,一首情诗。雨打梨花深闭门,忘了青春,误了青春。赏心乐事共谁论,花下销魂,月下销魂。愁聚眉峰尽日颦,千点啼痕,万点啼痕。晓看天色暮看云,行也思君,坐也思君。
新疆油腻大叔发表于 2个月前
来了
shepherd发表于 2个月前
厉害了