PostgreSQL-XL之 序列(Sequence)
目录
序列的定义和作用
PostgreSQL-XL 中序列的特殊性
序列的使用方法
1. 创建序列
2. 在分布式表中使用序列
3. 手动操作序列值
4.查看序列与表的关联关系
关键注意事项
典型使用场景
故障排查技巧
在 PostgreSQL-XL 中,序列(Sequence)是一种特殊的数据库对象,用于生成唯一的数值序列。作为分布式数据库,PostgreSQL-XL 中的序列需要特殊处理以保证全局唯一性。
序列的定义和作用
定义:
序列是一个数据库对象,通过 CREATE SEQUENCE
命令创建:
CREATE SEQUENCE sequence_name[ INCREMENT BY increment ][ MINVALUE minvalue | NO MINVALUE ][ MAXVALUE maxvalue | NO MAXVALUE ][ START [ WITH ] start ][ CACHE cache ][ [ NO ] CYCLE ];
核心作用:
- 生成唯一标识符:为分布式表的主键提供全局唯一的自增值
- 避免主键冲突:在分布式环境中保证不同节点生成的值不重复
- 替代 AUTO_INCREMENT:类似于其他数据库的自增字段功能
PostgreSQL-XL 中序列的特殊性
由于是分布式架构,序列有两种实现方式:
-
本地序列 (Local Sequence)
- 每个数据节点独立生成序列值
- 风险:不同节点可能生成相同值(不推荐用于分布式表)
-
全局序列 (Global Sequence) - 推荐使用
CREATE SEQUENCE global_seq_idINCREMENT 1MINVALUE 1MAXVALUE 9223372036854775807START 1CACHE 100; -- 重要:设置缓存提高性能
- 由协调器节点统一管理分配
- 保证整个集群范围内的唯一性
- 通过
CACHE
参数预取多个值减少协调器负载
序列的使用方法
1. 创建序列
-- 创建全局序列(推荐)
CREATE SEQUENCE user_id_seq START 1001 INCREMENT 1 CACHE 50;-- 创建带所有参数的序列
CREATE SEQUENCE order_seqINCREMENT 2MINVALUE 1000MAXVALUE 999999START 1000CACHE 20NO CYCLE;
2. 在分布式表中使用序列
-- 创建分布式表
CREATE TABLE users (id BIGINT DEFAULT nextval('user_id_seq') PRIMARY KEY,name TEXT NOT NULL
) DISTRIBUTE BY HASH(id); -- 注意:需使用序列列作为分布键-- 插入数据(自动生成ID)
INSERT INTO users (name) VALUES ('Alice'); -- ID自动生成
INSERT INTO users (name) VALUES ('Bob'); -- ID自动递增
3. 手动操作序列值
-- 获取下一个值
SELECT nextval('user_id_seq'); -- 获取当前值(当前会话中)
SELECT currval('user_id_seq'); -- 重置序列
ALTER SEQUENCE user_id_seq RESTART WITH 2000;-- 查看序列信息
\d user_id_seqselect * from information_schema.sequences where sequence_schema = 'public';
4.查看序列与表的关联关系
通过系统表 pg_depend
查询(推荐)
此方法直接追踪序列与表的依赖关系,适用于所有序列(包括显式创建或通过 SERIAL
自动生成的序列):
SELECTdep.refobjid::regclass AS related_table, -- 使用序列的表att.attname AS column_name -- 使用序列的列
FROM pg_depend dep
JOIN pg_attribute att ON att.attrelid = dep.refobjid AND att.attnum = dep.refobjsubid
WHERE dep.objid = 'your_sequence_name'::regclass -- 替换目标序列名AND dep.classid = 'pg_class'::regclassAND dep.refclassid = 'pg_class'::regclass;
关键注意事项
-
分布式表使用要求:
- 序列列必须作为分布键(
DISTRIBUTE BY
子句) - 否则可能导致数据分布不均或查询性能问题
- 序列列必须作为分布键(
-
性能优化:
-- 重要:设置足够大的CACHE值 ALTER SEQUENCE user_id_seq CACHE 100;
- 减少协调器节点的访问压力
- 建议缓存值 ≥ 节点数 × 并发连接数
-
序列管理命令:
-- 修改序列属性 ALTER SEQUENCE user_id_seq INCREMENT BY 2;-- 删除序列 DROP SEQUENCE IF EXISTS user_id_seq;-- 查看所有序列 \ds select * from information_schema.sequences ;
-
分布式事务安全:
- 全局序列通过协调器保证事务一致性
- 即使集群节点故障,也不会出现重复值
典型使用场景
-
分布式表主键生成:
CREATE TABLE orders (order_id BIGINT DEFAULT nextval('global_order_seq') PRIMARY KEY,product_id INT,quantity INT ) DISTRIBUTE BY HASH(order_id);
-
多表共享序列:
-- 创建共享序列 CREATE SEQUENCE global_id_seq CACHE 100;-- 表A使用 CREATE TABLE A (id BIGINT DEFAULT nextval('global_id_seq') PRIMARY KEY,... ) DISTRIBUTE BY HASH(id);-- 表B使用 CREATE TABLE B (id BIGINT DEFAULT nextval('global_id_seq') PRIMARY KEY,... ) DISTRIBUTE BY HASH(id);
-
自定义ID规则:
-- 生成带前缀的ID:USER-1001 CREATE SEQUENCE user_seq START 1001;INSERT INTO users (user_code) VALUES ('USER-' || nextval('user_seq'));
故障排查技巧
-
序列不同步问题:
-- 强制同步序列到最新值 SELECT setval('user_id_seq', (SELECT MAX(id) FROM users));
-
查看序列使用情况:
SELECT sequencename, last_value, cache_value FROM pg_sequences WHERE schemaname = 'public';
-
权限管理:
-- 授权序列使用权 GRANT USAGE ON SEQUENCE user_id_seq TO app_user;
在 PostgreSQL-XL 中使用序列时,务必使用全局序列并合理设置 CACHE
参数,这是保证分布式环境下高性能和一致性的关键。对于高频插入场景,建议缓存值设置在 100-1000 范围。