表结构设计 使用分区表 分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。分区表和普通表相比具有以下优点: 1.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。 2.增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。 3.方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。 DWS支持的分区表为范围分区表和列表分区(列表分区8.1.3集群版本支持)。 使用局部聚簇 局部聚簇(Partial Cluster Key)是列存下的一种技术。这种技术可以通过min/max稀疏索引较快的实现基表扫描的filter过滤。Partial Cluster Key可以指定多列,但是一般不建议超过2列。Partial Cluster Key的选取原则: 1.受基表中的简单表达式约束。这种约束一般形如col op const,其中col为列名,op为操作符 、>、>、<、<,const为常量值。 2.尽量采用选择度比较高(过滤掉更多数据)的简单表达式中的列。 3.尽量把选择度比较低的约束col放在Partial Cluster Key中的前面。 4.尽量把枚举类型的列放在Partial Cluster Key中的前面。 选择数据类型 高效数据类型,主要包括以下三方面: 1.尽量使用执行效率比较高的数据类型 一般来说整型数据运算(包括、>、<、≧、≦、≠等常规的比较运算,以及group by)的效率比字符串、浮点数要高。比如某客户场景中对列存表进行点查询,filter条件在一个numeric列上,执行时间为10+s;修改numeric为int类型之后,执行时间缩短为1.8s左右。 2.尽量使用短字段的数据类型 长度较短的数据类型不仅可以减小数据文件的大小,提升IO性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint。 3.使用一致的数据类型 表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销。