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

目录
相关文章
|
7月前
|
Oracle 关系型数据库 MySQL
一文了解PostgreSQL MVCC机制
一文了解PostgreSQL MVCC机制
390 0
|
10月前
|
缓存 关系型数据库 MySQL
postgresql|数据库|序列Sequence的创建和管理
postgresql|数据库|序列Sequence的创建和管理
242 0
|
关系型数据库 PostgreSQL
『PostgreSQL』PGSQL手动创建Sequence序列
📣读完这篇文章里你能收获到 - 在PostgreSQL中对Sequence的管理及使用
753 0
|
SQL 缓存 关系型数据库
Citus 分布式 PostgreSQL 集群 - SQL Reference(手动查询传播)
Citus 分布式 PostgreSQL 集群 - SQL Reference(手动查询传播)
197 0
|
SQL 存储 缓存
Citus 分布式 PostgreSQL 集群 - SQL Reference(摄取、修改数据 DML)
Citus 分布式 PostgreSQL 集群 - SQL Reference(摄取、修改数据 DML)
165 0
|
SQL 关系型数据库 MySQL
PolarDB-X 1.0-SQL 手册-Sequence--Sequence 介绍
DRDS 全局唯一数字序列(64 位数字,对应 MySQL 中 Signed BIGINT 类型,以下简称为 Sequence)的主要目标是为了生成全局唯一和有序递增的数字序列,常用于主键列、唯一索引列等值的生成。 DRDS 中的 Sequence 主要有两类用法: 显式 Sequence,通过 Sequence DDL 语法创建和维护,可以独立使用;通过select seq.nextval获取序列值,seq 是具体 Sequence 的名字; 隐式 Sequence,在为主键定义 AUTO_INCREMENT 后,用于自动填充主键,由 DRDS 自动维护。
375 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
310 0
|
SQL 关系型数据库 数据库
PostgreSQL 9.6 单元化,sharding (based on postgres_fdw) - 内核层支持前传
PostgreSQL 9.6 单元化,sharding (based on postgres_fdw) - 内核层支持前传 作者 digoal 日期 2016-10-04   标签 PostgreSQL , 9.6 , 水平分库 , shard
4812 0
|
缓存 算法 关系型数据库
阿里云DRDS 的sequence序列深入理解
DRDS的隐式sequence的一些测试,以及在DRDS迁移的过程中踩到的坑--
5250 0