云数据库 GAUSSDB-表设计规范:选择分布键
选择分布键
分布表的分布键选择至关重要,如果分布键选择不当,可能会导致数据倾斜,从而导致查询时,I/O负载集中在部分DN上,影响整体查询性能。因此,在确定分布表的分布策略之后,需要对表数据进行倾斜性检查,以确保数据的均匀分布。分布键的选择一般需要遵循以下原则:
- 【建议】选作分布键的字段取值应该比较离散,以便数据能在各个DN上均匀分布。当单个字段无法满足离散条件时,可以考虑使用多个字段一起作为分布键。一般情况下,可以考虑选择表的主键作为分布键。例如,在人员信息表中选择证件号码作为分布键。
- 【建议】在满足第一条原则的情况下,尽量不要选取在查询中存在常量过滤条件的字段作为分布键。例如,在表dwcjk相关的查询中,字段zqdh存在常量过滤条件“zqdh='000001'”,那么尽量不选择zqdh字段作为分布键。
- 【建议】在满足前两条原则的情况,尽量选择查询中的关联条件为分布键。当关联条件作为分布键时,join任务的相关数据都分布在DN本地,将极大减少DN之间的数据流动代价。
- 【建议】分布键不建议超过3列,列数过多将带来较高的计算开销。
- 【规则】合理设计分布键,既考虑查询开发的便利性,又要考虑数据的均匀存储,避免数据倾斜和读热点。
- 应使用取值较为离散的字段作为分布键,以便数据能够均匀分布到各个DN中。
- 在满足条件1情况下,存在常量过滤的字段不建议成为分布键,否则会使得所有的查询任务都会分发到唯一固定的DN上。
- 在满足条件1和2原则下,尽量选择查询中的关联条件作为分布键,这样可保证JOIN任务的相关数据分布在相同的DN上,减少DN间数据的流动代价。
表2 常见的分布键及效果 分布键值
分布键分布均匀性
用户 ID,应用程序中有许多用户。
好
状态代码,只有几个可用的状态代码。
差
项目创建日期,四舍五入至最近的时间段 (例如,天、小时或分钟)。
差
设备 ID,每个设备以相对类似的间隔访问数据.
好
设备 ID,被跟踪的设备有很多,但到现在为止,其中某个设备比其他所有设备更加常用。
差
- 【规则】分布键使用的列长度不易超过128,过长会带来较高的计算开销。
- 【规则】分布键值一旦插入不允许更新(UPDATE),如需更新需删除后插入。