表设计
GaussDB是分布式架构。数据分布在各个DN上。总体上讲,良好的表设计需要遵循以下原则:
- 将表数据均匀分布在各个DN上。数据均匀分布,可以防止数据在部分DN上集中分布,从而导致因存储倾斜造成集群有效容量下降。通过选择合适的分布列,可以避免数据倾斜。
- 将表的扫描压力均匀分散在各个DN上。避免扫描压力集中在部分DN上,而导致性能瓶颈。例如,在事实表上使用等值过滤条件时,将会导致扫描压力不均匀。
- 减少需要扫描的数据量。通过分区表的剪枝机制可以大幅减少数据的扫描量。
- 尽量减少随机I/O。通过聚簇可以实现热数据的连续存储,将随机I/O转换为连续I/O,从而减少扫描的I/O代价。
- 尽量避免数据shuffle。shuffle是指在物理上,数据从一个节点传输到另一个节点。shuffle占用了大量宝贵的网络资源,减小不必要的数据shuffle,可以减少网络压力,使数据的处理本地化,以提高集群的性能和可支持的并发度。通过对关联条件和分组条件的仔细设计,能够尽可能的减少不必要的数据shuffle。
选择分布方案
表的分布方式的选择如表2 表的分布方式及使用场景所示。
典型的分布表定义如下:
|
更多的表分布语法信息请参见CREATE TABLE。
选择分布键
分布表的分布键选择至关重要,如果分布键选择不当,可能会导致数据倾斜,从而导致查询时,I/O负载集中在部分DN上,影响整体查询性能。因此,在确定分布表的分布策略之后,需要对表数据进行倾斜性检查,以确保数据的均匀分布。分布键的选择一般需要遵循以下原则:
- 选作分布键的字段取值应该比较离散,以便数据能在各个DN上均匀分布。当单个字段无法满足离散条件时,可以考虑使用多个字段一起作为分布键。一般情况下,可以考虑选择表的主键作为分布键。例如,在人员信息表中选择证件号码作为分布键。
- 在满足第一条原则的情况下,尽量不要选取在查询中存在常量过滤条件的字段作为分布键。例如,在表dwcjk相关的查询中,字段zqdh存在常量过滤条件“zqdh='000001'”,那么尽量不选择zqdh字段作为分布键。
- 在满足前两条原则的情况,尽量选择查询中的关联条件为分布键。当关联条件作为分布键时,join任务的相关数据都分布在DN本地,将极大减少DN之间的数据流动代价。
选择分区方案
当表中的数据量很大时,应当对表进行分区,一般需要遵循以下原则:
- 使用具有明显区间性的字段进行分区,比如日期、区域等字段上建立分区。
- 分区名称应当体现分区的数据特征。例如,关键字+区间特征。
- 将分区上边界的分区值定义为MAXVALUE,以防可能出现的数据溢出。
|
分区方式 |
描述 |
|---|---|
|
Range |
表数据通过范围进行分区。 |
|
List |
表数据通过指定列按照具体值进行分区。 |
|
Hash |
表数据通过Hash散列方式进行分区。 |
典型的分区表定义如下:
|
更多的表分区语法信息请参见CREATE TABLE PARTITION。
浙公网安备 33010602011771号