更新时间:2026-07-28 GMT+08:00
分享

二级分区模板

二级分区模板是一组自定义的二级分区定义,在二级分区表下创建一级分区且未声明二级分区定义时,会使用二级分区模板进行自动创建二级分区。

  • 基于模板创建的二级分区,二级分区名由一级分区名拼接模板对象名组成,当已存在重名的分区名时,基于模板创建二级分区时会执行报错。
  • 模板的分区定义继承分区表的分区创建相关约束,即分区名互不重复,分区范围满足二级分区键约束。
  • 二级分区自动扩展与模板定义互斥,即当二级分区定义为AUTOMATIC LIST或INTERVAL时,不能创建分区模板;存在分区模板时,不能将二级分区定义改为AUTOMATIC LIST或INTERVAL。
  • 由于M-Compatibility模式数据库不支持自增分区相关语法,且仅支持*-hash二级分区,基于模板创建二级分区仅在非M-Compatibility模式数据库下支持。

示例

  • 创建二级分区表,声明二级分区模板定义,且在一级分区中未对二级分区定义进行声明,则使用模板在一级分区下自动创建二级分区。
    gaussdb=# CREATE TABLE t1
    (
        c1 INT,
        c2 INT
    )
    PARTITION BY LIST(c1)
    SUBPARTITION BY LIST(c2)
    SUBPARTITION TEMPLATE
    (
        SUBPARTITION sys_sp1 VALUES(1),
        SUBPARTITION sys_sp2 VALUES(2),
        SUBPARTITION sys_sp3 VALUES(3)
    )
    (
        PARTITION p1 VALUES (1)
        (
            SUBPARTITION sp1 VALUES(1)
        ),
        PARTITION p2 VALUES (2)
    );

    以上示例代码与如下命令实现功能等价:

    gaussdb=# CREATE TABLE t1
    (
        c1 INT,
        c2 INT
    )
    PARTITION BY LIST(c1)
    SUBPARTITION BY LIST(c2)
    (
        PARTITION p1 VALUES (1)
        (
            SUBPARTITION sp1 VALUES(1)
        ),
        PARTITION p2 VALUES (2)
        (
    	SUBPARTITION p2_sys_sp1 VALUES(1),
    	SUBPARTITION p2_sys_sp2 VALUES(2),
    	SUBPARTITION p2_sys_sp3 VALUES(3)
        )
    );
  • 手动新增一级分区,并且未对二级分区定义进行定义,会基于模板创建二级分区。
    gaussdb=# ALTER TABLE t1 ADD PARTITION p3 VALUES(3);

    以上示例代码与如下命令实现功能等价:

    gaussdb=# ALTER TABLE t1 ADD PARTITION p3 VALUES(3) (SUBPARTITION p3_sys_sp1 VALUES(1), SUBPARTITION p3_sys_sp2 VALUES(2), SUBPARTITION p3_sys_sp3 VALUES(3));
  • 非透明多写特性下,如果一级分区策略是INTERVAL,插入数据导致自动新增一级分区时,存在二级分区模板会使用模板创建二级分区。
    gaussdb=# ALTER TABLE t1 SET PARTITIONING INTERVAL(10);
    gaussdb=# INSERT INTO t1 VALUES(35,1);

    以上示例代码与如下命令实现功能等价:

    gaussdb=# ALTER TABLE t1 ADD PARTITION sys_p1 VALUES LESS THAN (40) (SUBPARTITION sys_p1_sys_sp1 VALUES(1), SUBPARTITION sys_p1_sys_sp2 VALUES(2), SUBPARTITION sys_p1_sys_sp3 VALUES(3));
    gaussdb=# INSERT INTO t1 VALUES(35,1);
  • 指定一个不存在的一级分区创建分类索引,会新建一个一级分区,存在二级分区模板会使用模板创建二级分区。
    --自动新建一个一级分区sys_p2,范围为[30,40),其下定义的二级分区为(SUBPARTITION sys_p2_sys_sp1 VALUES(1), SUBPARTITION sys_p2_sys_sp2 VALUES(2))。
    gaussdb=# CREATE INDEX t1_idx1 ON t1(c1) LOCAL (PARTITION p1_idx1 for (32));
  • 二级分区模板支持新增、修改和删除。
    --新增、修改二级分区模板。
    gaussdb=# ALTER TABLE t1 SET SUBPARTITION TEMPLATE (SUBPARTITION sys_p1 VALUES(1), SUBPARTITION sys_p2 VALUES(2));
    --删除二级分区模板。
    gaussdb=# ALTER TABLE t1 SET SUBPARTITION TEMPLATE ();
    -- 清理示例。
    gaussdb=# DROP TABLE t1;

相关文档