数据库Segment优化
表分布
选择合适的分布键,分布键是表里的唯一性索引,可以是一个或者多个列。(理想情况下,单列可以将数据平均分布在每个Segment上)。合适的分布键,每个Segment上应该有相同的记录数。
选择分布键原则:
- 尽量选择经常需要JOIN的列,减少重分布或者广播小表带来的开销。
- 尽量选择分布均匀的列或者多列,减少时间消耗卡在单个Segment的风险。
- 分布键和分区键不要放在同一列上。
- 只有在没有合适分布键的情况下,选择随机分布,且尽量选择类似维度表的小表。类似事实表的大表,不要选择随机分布。
表分区
合适的分区策略减少访问数据量,只访问相关数据。但分区不是分布式的替代品,数据分布是在物理上拆分表数据,将数据打散到各个节点,使数据可以并行计算,这在Greenplum中是必须的。而表分区是在逻辑上拆分大表的数据提高查询性能,也有利于数据生命周期的管理,而分区和分布式一起使用,可提升数据性能。
选择分区原则:
- 表数据量是否足够大:通常对于大的事实表,比如数据量有几千万或者过亿,我们可以考虑使用分区表,但数据量大小并没有一个绝对的标准可以使用,一般是根据经验,以及对目前性能是否满意。
- 表是否有合适的分区字段:如果数据量足够大了,这个时候我们就需要看下是否有合适的字段能够用来分区,通常如果数据有时间维度,比如按天,按月等,是比较理想的分区字段。
- 表内数据是否具有生命周期:通常数仓中的数据不可能一直存放,一般都会有一定的生命周期,比如最近一年等,这里就涉及到对旧数据的管理,如果有分区表,就很容易删除旧的数据,或者将旧的数据归档到对象存储等更为廉价的存储介质上。
- 查询语句中是否含有分区字段:如果你对一个表做了分区,但是所有的查询都不带分区字段,这不仅无法提高性能反而会使性能下降,因为所有的查询都会扫描所有的分区表。
表压缩和列存储
Greenplum支持行存储和列存储,行存储适合非常典型的OLTP应用场景,而列存储适合OLAP应用场景,尤其是按列做较大范围的聚合分析等。在列存储上进行压缩,可以减少IO访问。
父主题: 数据库调优