Greenplum Sequence机制

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

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多了一次交互,这样会影响性能,建议应用层生成自增值。

目录
相关文章
|
5月前
|
Oracle 关系型数据库 数据库
在Flink CDC中,使用Oracle 11g数据库的NUMBER类型作为主键
在Flink CDC中,使用Oracle 11g数据库的NUMBER类型作为主键
48 1
|
8月前
|
分布式计算 Oracle 关系型数据库
在Flink中使用CDC同步Oracle中的RowID
在Flink中使用CDC同步Oracle中的RowID
409 1
|
SQL 缓存 关系型数据库
Citus 分布式 PostgreSQL 集群 - SQL Reference(手动查询传播)
Citus 分布式 PostgreSQL 集群 - SQL Reference(手动查询传播)
157 0
|
SQL 存储 缓存
Citus 分布式 PostgreSQL 集群 - SQL Reference(摄取、修改数据 DML)
Citus 分布式 PostgreSQL 集群 - SQL Reference(摄取、修改数据 DML)
124 0
|
SQL 存储 关系型数据库
Citus 分布式 PostgreSQL 集群 - SQL Reference(查询处理)
Citus 分布式 PostgreSQL 集群 - SQL Reference(查询处理)
151 0
|
SQL 并行计算 关系型数据库
Citus 分布式 PostgreSQL 集群 - SQL Reference(SQL支持和变通方案)
Citus 分布式 PostgreSQL 集群 - SQL Reference(SQL支持和变通方案)
146 0
|
关系型数据库 MySQL 数据库
PolarDB-X 1.0-SQL 手册-Sequence-Sequence限制及注意事项
限制与注意事项 转换 Sequence 类型时,必须指定 START WITH 起始值; 单元化 Group Sequence 不支持作为源或目标的类型转换,也不支持起始值以外的参数修改; 属于同一个全局唯一数字序列分配空间的每个单元化 Group Sequence,必须指定相同的单元数量和不同的单元索引; 在 PolarDB-X 非拆分模式库(即后端仅关联一个已有的 RDS 物理库)、或拆分模式库中仅有单表(即所有表都是单库单表,且无广播表)的场景下执行 INSERT 时, PolarDB-X 会自动优化并直接下推语句,绕过优化器中分配 Sequence 值的部分。此时 INSERT INT
258 0
|
SQL Oracle 关系型数据库
xDB Replication Server - PostgreSQL, Oracle, SQL Server, PPAS 全量、增量(redo log based, or trigger based)同步(支持single-master, mult-master同步, 支持DDL)
xDB Replication Server - PostgreSQL, Oracle, SQL Server, PPAS 全量、增量(redo log based, or trigger based)同步(支持single-master, mult-master同步, 支持DDL)
774 0

热门文章

最新文章