greenplum创建表
分布键是按照这个字段值将表中的数据平均分布到每一个节点机器上,
分区是将一张大表按照分区的方式拆成N张小表
每张表必须有分布键,默认情况下会使用长度短的字段作为分布键,根据分布键的原理,建议使用需要经常作为连接键的字段作为分布键,
分区,是从逻辑上把一个大表分开,这样可以优化查询性能。分区是不会影响数据在各个SEGMENT上的分布情况的
分布,是从物理上把数据分散到各个SEGMENT上,这样更有利于并行查询
gp的分布键主要功能就是为了避免数据倾斜:
1.分布键必须自己主动指定,不能使用默认分布键(建表语句中没写分布键)
2.分布键必须能够使数据均匀的分布到各个节点上
1.表是为了存储而生:gp表的分布键应该做到能使数据分布均匀的功能,用主键字段,或联合主键字段作为分布键。
2.表是为了计算而生:gp表的分布键应该做到关联键为分布键的功能,切不宜超过三个,这是为效率考虑。
greenplum由多个postgres组合而成,因此greenplum属于分布式数据库,所以在创建数据表的时候需要指定分布键,当然在不指定的时候greenplum数据库会默认使用使用表的个字段作为数据库的分布键。
greenplum分布策略
(1)hash分布:选择一个列后者多个列作为数据表的分布键,通过hash计算,然后将插入的数据路由到特定的segment上;
CREATE TABLE TEST(
id INT,
num INT,
data INT
)
distribute by id;
(2)随机分布:数据随机分散在每一个节点中,可以保证数据平均分布,但是在执行 SQL 的过程中,关联等操作都需要将数据重分布,性能较差。
CREATE TABLE TEST(
id INT,
num INT,
data INT
)
distribute by random;
greenplum分布键选取策略:
(1)尽量选择经常需要JOIN的列:当关联键和分布键均一致时,可以在 Segment 中完成 JOIN,不需要重分布或者广播小表;当关联键和分布键不一致时,则需要重分布不一致的表或者广播小表,带来额外的开销。
(2)尽量选择分布均匀的列或者多列:若选择的分布列值分布不均匀,则可能导致数据倾斜。某些 Segment 非常大(压力大),某些 Segment 非常小。根据木桶原理,时间消耗会卡在数据多的节点上。
(3)尽量选择高并发查询的条件列(指该查询条件产生的中间结果集小的,如果中间结果集很大,那就让所有节点都来参与运算更好,因此不选)
如果数据经常被高并发的键值或离散查询,可以将查询条件的列作为分布列,这样不需要连接到所有的 Segment 去查,可以大大提高并发能力。
(4)不要轻易使用随机分布
分区:按照字段逻辑进行逻辑划分的区域,把一张大表进行按照适合的维度进行分割,通过表的继承,规则,约束实现的,有助于提高数据查询性能,利于数据仓库的维护工作。
分区分类:
(1)列表分区
create table schema_name.partition_list(
id1 integer,
id2 varchar(10))
distributed by (id1)
partition by list (id2)
(
partition p1 values (‘1’,‘2’) ,
partition p2 values (‘3’,‘0’) ,
default partition pd
);
(2)范围分区
create table schema_name.partition_range01
(id1 integer,
id2 varchar(10),
id3 date,
id4 integer,
id5 date
)
distributed by (id1)
partition by range(id3)
( partition partition_range01_id3_1 START (date’2018-08-20’) INCLUSIVE,
partition partition_range01_id3_2 START (date’2018-09-21’) INCLUSIVE
END (date’2018-10-01’) EXCLUSIVE
);
create table schema_name.partition_range02
(id1 integer,
id2 varchar(10),
id3 date,
id4 integer,
id5 date
)
distributed by (id1)
partition by range(id4)
( START (1) END (31) every(1),
default partition none
);
create table schema_name.partition_range03
(id1 integer,
id2 varchar(10),
id3 date,
id4 integer,
id5 date
)
distributed by (id1)
partition by range(id5)
( START (date ‘2018-01-01’) INCLUSIVE
END (date ‘2019-01-01’) EXCLUSIVE
EVERY (INTERVAL ‘7 day’)
);
(3)组合/多级分区
–首先以period字段为表p建立一级范围分区,指定从18年到19年每一个月为一个子分区表
–子分区表以region字段为一级分区建立二级子分区
create table schema_name.partition_range_list(
id int,
period date,
Sales decimal(9,6),
Region varchar(500)
)
distributed by (id)
partition by range (period)
subpartition by list (region)
subpartition template
(
subpartition usa values (‘usa’),
subpartition asia values (‘asia’),
subpartition europe values (‘europe’),
default subpartition other
)
(
start (‘2018-01-01’) inclusive
end (‘2019-01-01’) exclusive
every (interval ‘1 month’),
default partition other
);
本文来源:https://blog.csdn.net/Mavey__/article/details/117665741
相关文章