Greenplum Sequence机制

本文介绍了Greenplum中Sequence的使用方式及其实现机制。Sequence由Master节点维护,通过seqserver进程统一管理,确保了在MPP架构下Sequence值的唯一性。文章详细解释了Sequence的分配过程及其对性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sequence(序列)是数据库经常使用自增列属性,对于单机PostgreSQL实例,数据库维护一个自增变量即可。但是对于Greenplum的MPP架构,如果每个节点都维护自己的Sequence,那么Sequence将会出现重复,那么Greenplum是如何处理的呢?

如何使用Sequence
create table test_sequence(id serial, name text);
 
postgres=> \d
public | test_sequence | table | postgres
public | test_sequence_id_seq | sequence | postgres

postgres=> insert into test_sequence (name) values(1);
INSERT 0 1
postgres=> insert into test_sequence (name) values(2);
INSERT 0 1
postgres=> insert into test_sequence (name) values(3);
INSERT 0 1
postgres=> select * from test_sequence;
 id | name
----+------
  3 | 3
  1 | 1
  2 | 2
(3 rows)
Sequence是谁维护

查看Master的Sequence维护元信息

postgres=> select * from test_sequence_id_seq;
    sequence_name     | last_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
----------------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 test_sequence_id_seq |          3 |            1 | 9223372036854775807 |         1 |           1 |      30 | f         | t
(1 row)

查看Segment的Sequence维护元信息

postgres=> select * from gp_dist_random('test_sequence_id_seq');
    sequence_name     | last_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
----------------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 test_sequence_id_seq |          1 |            1 | 9223372036854775807 |         1 |           1 |       1 | f         | f
 test_sequence_id_seq |          1 |            1 | 9223372036854775807 |         1 |           1 |       1 | f         | f
 test_sequence_id_seq |          1 |            1 | 9223372036854775807 |         1 |           1 |       1 | f         | f
 test_sequence_id_seq |          1 |            1 | 9223372036854775807 |         1 |           1 |       1 | f         | f
(4 rows)

通过Master和Segment的元信息可以看出,只有Master一直更新元信息,Segment的Sequence元信息一直不变,所以Sequence是由Master维护的。

Sequence分配过程

image.png | center | 530x582

如何所示,Master上有一个seqserver进程,专门用来维护全局的Sequence信息。所有的Segment获取最新的Sequence都需要向Master的seqserver请求,然后seqserver更新Sequence云信息,返回给Segment。为了实现Sequence,Master和Segment多了一次交互,这样会影响性能,建议应用层生成自增值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值