PostgreSQL-XL之 序列(Sequence)

发布于:2025-07-04 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

序列的定义和作用

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 ];

核心作用

  1. 生成唯一标识符:为分布式表的主键提供全局唯一的自增值
  2. 避免主键冲突:在分布式环境中保证不同节点生成的值不重复
  3. 替代 AUTO_INCREMENT:类似于其他数据库的自增字段功能

PostgreSQL-XL 中序列的特殊性

由于是分布式架构,序列有两种实现方式:

  1. 本地序列 (Local Sequence)

    • 每个数据节点独立生成序列值
    • 风险:不同节点可能生成相同值(不推荐用于分布式表)
  2. 全局序列 (Global Sequence) - 推荐使用

    CREATE SEQUENCE global_seq_id
        INCREMENT 1
        MINVALUE 1
        MAXVALUE 9223372036854775807
        START 1
        CACHE 100;  -- 重要:设置缓存提高性能
    
    • 由协调器节点统一管理分配
    • 保证整个集群范围内的唯一性
    • 通过 CACHE 参数预取多个值减少协调器负载

序列的使用方法

1. 创建序列
-- 创建全局序列(推荐)
CREATE SEQUENCE user_id_seq START 1001 INCREMENT 1 CACHE 50;

-- 创建带所有参数的序列
CREATE SEQUENCE order_seq
    INCREMENT 2
    MINVALUE 1000
    MAXVALUE 999999
    START 1000
    CACHE 20
    NO 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_seq

select * from information_schema.sequences where sequence_schema = 'public';
4.查看序列与表的关联关系

通过系统表 pg_depend 查询(推荐)

此方法直接追踪序列与表的依赖关系,适用于所有序列(包括显式创建或通过 SERIAL 自动生成的序列):

SELECT
    dep.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'::regclass
  AND dep.refclassid = 'pg_class'::regclass;

关键注意事项

  1. 分布式表使用要求

    • 序列列必须作为分布键(DISTRIBUTE BY 子句)
    • 否则可能导致数据分布不均或查询性能问题
  2. 性能优化

    -- 重要:设置足够大的CACHE值
    ALTER SEQUENCE user_id_seq CACHE 100;
    
    • 减少协调器节点的访问压力
    • 建议缓存值 ≥ 节点数 × 并发连接数
  3. 序列管理命令

    -- 修改序列属性
    ALTER SEQUENCE user_id_seq INCREMENT BY 2;
    
    -- 删除序列
    DROP SEQUENCE IF EXISTS user_id_seq;
    
    -- 查看所有序列
    \ds
    select * from information_schema.sequences ;
  4. 分布式事务安全

    • 全局序列通过协调器保证事务一致性
    • 即使集群节点故障,也不会出现重复值

典型使用场景

  1. 分布式表主键生成

    CREATE TABLE orders (
        order_id BIGINT DEFAULT nextval('global_order_seq') PRIMARY KEY,
        product_id INT,
        quantity INT
    ) DISTRIBUTE BY HASH(order_id);
    
  2. 多表共享序列

    -- 创建共享序列
    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);
    
  3. 自定义ID规则

    -- 生成带前缀的ID:USER-1001
    CREATE SEQUENCE user_seq START 1001;
    
    INSERT INTO users (user_code) 
    VALUES ('USER-' || nextval('user_seq'));
    

故障排查技巧

  1. 序列不同步问题

    -- 强制同步序列到最新值
    SELECT setval('user_id_seq', (SELECT MAX(id) FROM users));
    
  2. 查看序列使用情况

    SELECT sequencename, last_value, cache_value 
    FROM pg_sequences 
    WHERE schemaname = 'public';
    
  3. 权限管理

    -- 授权序列使用权
    GRANT USAGE ON SEQUENCE user_id_seq TO app_user;
    

在 PostgreSQL-XL 中使用序列时,务必使用全局序列并合理设置 CACHE 参数,这是保证分布式环境下高性能和一致性的关键。对于高频插入场景,建议缓存值设置在 100-1000 范围。


网站公告

今日签到

点亮在社区的每一天
去签到