对于大规模并行处理数据库来说,一般由单master与多segment组成。
那么数据表的单行会被分配到一个或多个segment上,此时需要想一想分布策略
分布
在gp6中,共有三个策略:
哈希分布
随机分布
复制分布
哈希分布
就是对分布键进行hash,这样相同值的key始终散列到同一个segment上。如果选择唯一的分布键,将确保较均匀的数据分布。
要使用这一策略,需要在创建表使用 “DISTRIBUTED BY(column,[…])” 子句。
随机分布
将数据行按顺序依次发送到各个segment,此时具有相同值的数据行不一定位于同一个segment上。随机分布保证了数据的平均分布,但是性能显然不如hash
复制分布
gp会将每行数据分配到每个segment上,此策略下,表数据将均匀分布,每个segment存储同样的数据行。
当在segment上执行用户自定义函数且需要访问表中所有行时,此时需要用到此策略。
接下讲解分区概念
分布时对存储的数据进行物理划分,分区是逻辑划分。
分区将大表从逻辑上划分为多个子表,分区不会更改表数据在segment之间的物理分布。
分区
gp支持以下分区类型:
1、范围分区:根据数字范围,如日期或价格
2、列表分区:基于值列表的数据划分,如销售地区或者产品线
3、两种类型的组合
对大表分区可以简化数据库维护以及提高查询性能,例如通过对时间分区,可以将旧数据滚动移除出数据库。
但是创建过多的分区可能会拖慢管理和维护的速度,如清理,恢复segment,扩展集群等情况。
除非优化器可以通过查询谓词修剪分区,否则分区将不会提高查询性能。
依次扫描各个分区表的查询会比只需扫描无分区的根表要慢。所以当查询中很少使用分区裁剪的话,尽量避免对表分区。
参考
Greenplum数据分布和分区策略