TABLE对象设计规范(重点)
规则2.9 创建表时必须选择正确的分布方式和分布列
分布方式 |
描述 |
适用场景 |
---|---|---|
Hash |
表数据按照分布列生成的hash值与DN实例的映射关系,将数据分布到各DN实例。
|
大表、事实表。 |
RoundRobin |
表数据按照轮询的方式依次分布到各DN实例。
|
大表、事实表,无合适分布列的表。 |
Replication |
表中的全量数据在集群的每一个DN实例上保留一份。
|
小表、维度表。 |
规则2.10 创建表时必须选择正确的存储方式
存储方式 |
适用场景 |
不适用的场景 |
---|---|---|
行存 |
|
DML查询:统计分析类查询 (group , join的数据量大的场景)。
注意:
创建行存表(orientation = row)时,禁止指定compress属性,禁止使用行存压缩表。 |
列存 |
|
|
规则2.11 创建表时必须选择正确的分区策略
违反规范的影响:
分区的优点如下,如不做分区,其查询性能和数据治理效率会下降,数据量越大这种劣化越大。
- 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。
- 提升数据治理效率:如数据生命周期管理场景,针对历史分区做TRUNCATE/DROP PARTITION,效率和效果远优于DELETE。
方案建议:
- 针对包含时间类型字段的表设计分区。
分区策略 |
描述 |
适用场景 |
---|---|---|
范围分区(Range Partitioning) |
根据分区键值的范围,将数据存储到不同的分区中,分区键范围连续但不重叠。 |
|
列表分区(List Partitioning) |
根据分区键值的列表进行分区,各分区的列表值不重复 |
|
建议2.12 表字段的设计要遵循高效、准确原则
违反规范的影响:
- 存储空间大、查询效率降低。
方案建议:
- 选择最高效的类型。
- 如能整型就不用浮点型,能用整型就不用字符型。
- 使用变长字符类型时根据数据特征指定最大长度。
- 选择最准确的类型。
- 使用时间类型存储时间,不使用字符类型存储时间。
- 使用满足需求的最小数值类型,如果int或smallint够用,就不用bigint而浪费空间。
- 正确使用约束。
- 明确不存在NULL值的字段加上NOT NULL约束,优化器会在特定场景下对其进行自动优化。
- 业务层面能补全的字段,不要使用DEFAULT约束,避免数据加载时产生不符合预期的结果。
- 避免非必要类型转换。
- 当多个表存在逻辑关系时,表示同一含义的字段应该使用相同的数据类型。
- 不同类型的比较操作会导致数据类型转换,可能导致索引和分区剪枝失效,影响查询性能。