PolarDB PostgreSQL版(兼容Oracle)支持使用子分区模板在组合分区表中创建子分区。本文详细介绍了其语法和示例。
简介
PolarDB PostgreSQL版(兼容Oracle)支持使用子分区模板在组合分区表中创建子分区。子分区模板不需要为表中的每个分区指定子分区描述符,从而简化了子分区的规范。相反,您只需要在模板中描述子分区一次,然后将该子分区模板应用于表中的每个分区。对于interval- *
复合分区表,子分区模板是定义间隔分区的子分区的唯一方法。
如果分区未指定子分区描述符,系统将默认使用子分区模板来定义子分区。
如果分区已指定子分区描述符,系统将默认使用该描述符定义子分区。
如果分区未指定子分区描述符,也没有提供子分区模板,系统将默认创建一个默认子分区。
如果在子分区模板中指定了子分区名称,则对于使用该模板创建的子分区,名称为“分区名称_子分区模板名称”。例如:分区的名字为parta,子分区模板的名字为subpartb,拼接后生成的子分区名为parta_subpartb。
语法说明
创建子分区模板
------通用语法
CREATE TABLE table_definition PARTITION BY hash/range/list (column[, column ]...)
SUBPARTITION BY hash/range/list (column[, column ]...)
SUBPARTITION TEMPLATE (subpartition[, subpartition], ...)
(table_partition[, table_partition]...);
------仅适用于子分区是HASH分区类型的情况
CREATE TABLE table_definition PARTITION BY hash/range/list (column[, column ]...)
SUBPARTITION BY hash(column[, column ]...)
SUBPARTITION TEMPLATE num
(table_partition[, table_partition]...);
------仅适用于分区和子分区都是HASH分区类型的情况
CREATE TABLE table_definition PARTITION BY hash (column[, column ]...)
SUBPARTITION BY hash(column[, column ]...) PARTITIONS num SUBPARTITIONS num;
修改子分区模板
------通用语法
ALTER TABLE table_definition SUBPARTITION TEMPLATE (subpartition[, subpartition], ...);
------仅适用于子分区是HASH分区类型的情况
ALTER TABLE table_definition SUBPARTITION TEMPLATE number;
删除子分区模板
ALTER TABLE table_definition SUBPARTITION TEMPLATE ();
示例
创建RANGE类型的子分区模板
CREATE TABLE shipments
( order_id NUMBER NOT NULL
, order_date DATE NOT NULL
, delivery_date DATE NOT NULL
, customer_id NUMBER NOT NULL
, sales_amount NUMBER NOT NULL
)
PARTITION BY RANGE (order_date) SUBPARTITION BY RANGE(delivery_date)
SUBPARTITION TEMPLATE
(SUBPARTITION e VALUES LESS THAN (TO_DATE('15-AUG-2006','dd-MON-yyyy'))
, SUBPARTITION a VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy'))
, SUBPARTITION l VALUES LESS THAN (MAXVALUE) )
( PARTITION p_2006_jul VALUES LESS THAN (TO_DATE('01-AUG-2006','dd-MON-yyyy'))
, PARTITION p_2006_aug VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy'))
, PARTITION p_2006_sep VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))
, PARTITION p_2006_oct VALUES LESS THAN (TO_DATE('01-NOV-2006','dd-MON-yyyy'))
, PARTITION p_2006_nov VALUES LESS THAN (TO_DATE('01-DEC-2006','dd-MON-yyyy'))
, PARTITION p_2006_dec VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))
);
创建HASH类型的子分区模板
------仅适用于子分区是HASH分区类型的情况
CREATE TABLE emp_sub_template (deptno NUMBER, empname VARCHAR(32), grade NUMBER)
PARTITION BY RANGE(deptno) SUBPARTITION BY HASH(empname)
SUBPARTITION TEMPLATE 4
(PARTITION p1 VALUES LESS THAN (1000),
PARTITION p2 VALUES LESS THAN (2000),
PARTITION p3 VALUES LESS THAN (6000)
);
------仅适用于分区和子分区都是HASH分区类型的情况
CREATE TABLE hash_sub_template (deptno NUMBER, empname VARCHAR(32), grade NUMBER)
PARTITION BY HASH(deptno) SUBPARTITION BY HASH(empname) PARTITIONS 4 SUBPARTITIONS 3;
修改子分区模板
------通用语法
ALTER TABLE hash_sub_template SET SUBPARTITION TEMPLATE
(SUBPARTITION a1,
SUBPARTITION b1,
SUBPARTITION c1,
SUBPARTITION d1);
------仅适用于子分区是HASH分区类型的情况
ALTER TABLE hash_sub_template SET SUBPARTITION TEMPLATE 3;
查看子分区模板信息
子分区模板提供一个系统视图(DBA_SUBPARTITION_TEMPLATES)来查看分区表的子分区模板信息。
列名 | 描述 |
USER_NAME | 所属用户名。 |
TABLE_NAME | 表名。 |
SUBPARTITION_NAME | 模板中子分区名。 |
SUBPARTITION_POSITION | 模板中子分区位置编号,从1开始。 |
TABLESPACE_NAME | 表空间名。 |
HIGH_BOUND | 子分区边界上限。 |
查看子分区模板信息,示例如下:
SELECT * FROM DBA_SUBPARTITION_TEMPLATES;
user_name | table_name | subpartition_name | subpartition_position | tablespace_name | high_bound
-----------+-------------------+-------------------+-----------------------+-----------------+------------
PolarDB | EMP_SUB_TEMPLATE | | 1 | PG_DEFAULT |
PolarDB | EMP_SUB_TEMPLATE | | 2 | PG_DEFAULT |
PolarDB | EMP_SUB_TEMPLATE | | 3 | PG_DEFAULT |
PolarDB | EMP_SUB_TEMPLATE | | 4 | PG_DEFAULT |
PolarDB | HASH_SUB_TEMPLATE | A1 | 1 | PG_DEFAULT |
PolarDB | HASH_SUB_TEMPLATE | B1 | 2 | PG_DEFAULT |
PolarDB | HASH_SUB_TEMPLATE | C1 | 3 | PG_DEFAULT |
PolarDB | HASH_SUB_TEMPLATE | D1 | 4 | PG_DEFAULT |
(8 rows)
文档内容是否对您有帮助?