VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

CREATE TABLE SUBPARTITION

功能描述

创建二级分区表。分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。对于二级分区表,顶层节点表和一级分区都是逻辑表,不存储数据,只有二级分区(叶子节点)存储数据。

二级分区表的分区方案是由两个一级分区的分区方案组合而来的,一级分区的分区方案详见章节CREATE TABLE PARTITION

本文档只介绍CREATE TABLE SUBPARTITION语句兼容MySQL的特性,原Vastbase的CREATE TABLE SUBPARTITION语法未做删除和修改,详见CREATE TABLE SUBPARTITION

Vastbase在MySQL兼容模式下,支持CREATE TABLE SUBPARTITION如下特性用法:

  • CONSTRAINT [ constraint_name ]语法,在MySQL兼容模式下constraint_name为可选项,在其他模式数据库下,必须加上constraint_name。
  • 支持在指定表约束时使用索引名。
  • 支持在创建二级分区时指定创建索引的方法。

注意事项

该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。

语法格式

create table partition_table_name 
...
PARTITION BY { 
{RANGE (partition_key) [ INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, ... ] ) ] ] ( partition_less_than_item [, ... ] )} |
...
  • partition_less_than_item:设置范围分区上边界

    PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } ) | MAXVALUE
    

参数说明

  • partition_table_name

    分区表的名称。

  • PARTITION BY RANGE(partition_key)

    创建范围分区。partition_key为分区键的名称。

  • INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, … ] ) ]

    间隔分区定义信息。

    • interval_expr:自动创建分区的间隔,例如:1 day、1 month。
    • STORE IN (tablespace_name [, … ] ):指定存放自动创建分区的表空间列表,如果有指定,则自动创建的分区从表空间列表中循环选择使用,否则使用分区表默认的表空间。

    列存表不支持间隔分区。

  • PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } ) | MAXVALUE

    指定各分区的信息。partition_name为范围分区的名称。partition_value为范围分区的上边界,取值依赖于partition_key的类型。MAXVALUE表示分区的上边界,它通常用于设置最后一个范围分区的上边界。

    • 每个分区都需要指定一个上边界。
    • 分区上边界的类型应当和分区键的类型一致。
    • 分区列表是按照分区上边界升序排列的,值较小的分区位于值较大的分区之前。
    • 该情形下,分区键支持的数据类型为:TINYINT[UNSIGNED]、SMALLINT[UNSIGNED]、INTEGER[UNSIGNED]、BIGINT[UNSIGNED]、DECIMAL、NUMERIC、REAL、DOUBLE PRECISION、CHARACTER VARYING(n)、VARCHAR(n)、CHARACTER(n)、CHAR(n)、CHARACTER、CHAR、TEXT、NVARCHAR、NVARCHAR2、NAME、TIMESTAMP[(p)] [WITHOUT TIME ZONE]、TIMESTAMP[(p)] [WITH TIME ZONE]、DATE。

示例

示例1: MONTH函数作为分区键创建LIST分区表。

1、创建分区表使用MONTH函数作为分区键。

CREATE TABLE my_table1155872 (id INT,created_date DATE)
PARTITION BY LIST (MONTH(created_date)) (
PARTITION p1 VALUES IN (1, 2, 3),
PARTITION p2 VALUES IN (4, 5, 6),
PARTITION p3 VALUES IN (7, 8, 9),
PARTITION p4 VALUES IN (10, 11, 12)
);

2、插入数据。

insert into my_table1155872 values (1,'2023-05-23');
insert into my_table1155872 values (2,'2023-08-23');
insert into my_table1155872 values (3,'2023-12-23');

3、查看分区表数据。

select * from my_table1155872 PARTITION(p1);
select * from my_table1155872 PARTITION(p2);
select * from my_table1155872 PARTITION(p3);
select * from my_table1155872 PARTITION(p4);

返回结果分别为:

 id | created_date
----+--------------
(0 rows)

 id | created_date
----+--------------
  1 | 2023-05-23
(1 row)

 id | created_date
----+--------------
  2 | 2023-08-23
(1 row)

 id | created_date
----+--------------
  3 | 2023-12-23
(1 row)

示例2: 分区表使用less than maxvalue语法。

1、创建分区表。

CREATE TABLE my_table1155885(id INT,sale_date DATE)
PARTITION BY RANGE(MONTH(sale_date))(
PARTITION p1 VALUES LESS THAN (5),
PARTITION p2 VALUES LESS THAN (7),
PARTITION p3 VALUES LESS THAN MAXVALUE
);

2、插入数据。

insert into my_table1155885 values(0,'2021-03-23');
insert into my_table1155885 values(1,'2022-05-23');
insert into my_table1155885 values(2,'2022-08-23');

3、查看分区表数据。

select * from my_table1155885 PARTITION(p1);
select * from my_table1155885 PARTITION(p2);
select * from my_table1155885 PARTITION(p3);

返回结果分别为:

 id | sale_date
----+------------
  0 | 2021-03-23
(1 row)

 id | sale_date
----+------------
  1 | 2022-05-23
(1 row)

 id | sale_date
----+------------
  2 | 2022-08-23
(1 row)

示例3: 分区键使用算术运算符-

1、创建分区表。

CREATE TABLE my_table1155995(partition_key INT,column1 VARCHAR(255))
PARTITION BY RANGE (partition_key - 1)
(
PARTITION p1 VALUES LESS THAN (100),
PARTITION p2 VALUES LESS THAN (200),
PARTITION p3 VALUES LESS THAN (300)
);

2、插入数据。

insert into my_table1155995 values(89, 'vastbasevastbase');
insert into my_table1155995 values(100, 'vastbasevastbase');
insert into my_table1155995 values(280, 'vastbasevastbase');

3、查看分区表数据。

select * from my_table1155995 partition(p1);
select * from my_table1155995 partition(p2);
select * from my_table1155995 partition(p3);

返回结果分别为:

 partition_key |     column1
---------------+------------------
            89 | vastbasevastbase
           100 | vastbasevastbase
(2 rows)

 partition_key | column1
---------------+---------
(0 rows)

 partition_key |     column1
---------------+------------------
           280 | vastbasevastbase
(1 row)

示例4: 使用表达式作为分区键。

1、创建分区表。

create table testrangepart_1156035(a int, b int) 
partition by range(abs(a*2))
(
partition p0 values less than(100),
partition p1 values less than(200)
);

2、插入数据。

insert into testrangepart_1156035 values(-51,1),(49,2);
insert into testrangepart_1156035 values(-101,1);

返回结果为:

INSERT 0 2
ERROR:  inserted partition key does not map to any table partition

3、查看分区表数据。

select * from testrangepart_1156035 partition(p0);
select * from testrangepart_1156035 partition(p1);
select * from testrangepart_1156035 where a = -51;

返回结果分别为:

 a  | b
----+---
 49 | 2
(1 row)

  a  | b
-----+---
 -51 | 1
(1 row)

  a  | b
-----+---
 -51 | 1
(1 row)

4、更新分区。

update testrangepart_1156035 set a = -48 where a = -51;

5、查询更新后的分区。

select * from testrangepart_1156035 partition(p0);
select * from testrangepart_1156035 partition(p1);

返回结果为:

  a  | b
-----+---
  49 | 2
 -48 | 1
(2 rows)

 a | b
---+---
(0 rows)

6、删除数据并查询结果。

delete from testrangepart_1156035 where a = -48 or a = 49;
select * from testrangepart_1156035;

返回结果为:

 a | b
---+---
(0 rows)