GBase 8a
性能调优
文章

GBase 8a MPP Cluster的hash分布列选取策略

发表于2024-04-03 10:47:08803次浏览2个评论

哈希分布表

       选择有效的哈希分布策略,是保障数据均匀分布和提升性能体验的关键所在。下文将分享GBase 8a 对于 hash 分布列的选择建议~

选择的依据:

  1. 如果经常进行大表 join 连接,优先把 join 连接字段定义成 hash 分布列,这样使大表间的 join 尽量在本地运算,减少节点间数据的拉表操作;【相关子查询也可参考此原则】
  2. 其次考虑使用频率高的 group by 字段作为hash字段;
  3. 最后尽量保证使用频率较高的 where 等值查询列,努力保障其产生的结果集的存储也相对均匀的,避免在出现某些节点过于繁忙或清闲的情况;
  4. 针对上述三个条件判有多个选择时,优先挑选表中重复值较少的列,即选择count(distinct col)值大的列做 hash 分布列,以此保障所有节点的数据均匀存放,避免有节点出现数据分布过多或过少情况。

限制说明:

  • hash 分布列支持选择多列,最多支持10个字段;
  • hash 分布列支持整数型(int | bigint | smallint | tinyint)、浮点型(decimal | numeric)、字符型(varchar | varbinary)
  • hash 列在使用过程中,禁止加类似 LTRIM 等函数操作,此举会破坏 hash 分布;
  • hash 列的值,不允许进行 update 更新操作;

建议:

  • 当 join 的等值关联条件中有 hash 列时,尽量保持两个等值关联列在字段类型定义上完全相同;
  • 当 group by 语句中如果有 hash 列,请将 hash 列放到最前面;(多个 group 列时)
  • 当有多个 hash 分布列时,join 条件中应尽量包含所有 hash 列。

语法样例:

  • 创建哈希分布表

create table tb_name(
col1 int,
col2 varchar(20),
col3 datetime) distributied by ('col1');

  • 将已有表改为哈希分布表

create table hash_tb_name
distributed by ('col_name')
as select col1,col2,... 
from tb_name;

  • 将已有哈希分布表(hash)改为随机分布表(random)

drop distributed col_hash on hash_tb_name;
 

评论

登录后才可以发表评论
用户头像
levvel发表于 5个月前
进来看看,应该有收获
GBase用户47954发表于 1个月前
感谢作者的精彩分享!