首批通过分布式安全可靠测评,为关键业务系统打造
创建分区表
更新时间:2023-11-21 16:45:40
您可以根据业务需求,创建相应类型的一级分区表或二级分区表。
OceanBase 数据库中有两种表,分区表和非分区表。分区表是将一个表分解成多个更小的、更容易管理的部分。
支持的分区类型
OceanBase 数据库 Oracle 模式的一级分区支持的分区类型如下:Range 分区、List 分区及 Hash 分区。
OceanBase 数据库 Oracle 模式的二级分区为任意两种分区类型的组合,具体支持情况如下:
| 二级分区类型 | 创建模板化二级分区表 | 创建非模板化二级分区表 |
|---|---|---|
| Range + Range | 支持 | 支持 |
| Range + List | 支持 | 支持 |
| Range + Hash | 支持 | 支持 |
| List + Range | 支持 | 支持 |
| List + List | 支持 | 支持 |
| List + Hash | 支持 | 支持 |
| Hash + Range | 支持 | 支持 |
| Hash + List | 支持 | 支持 |
| Hash + Hash | 支持 | 支持 |
创建 Range 类型的一级分区表
语法
CREATE TABLE table_name (column_name column_type[, column_name column_type])
PARTITION BY RANGE (column_name[, column_name])
(PARTITION partition_name VALUES LESS THAN(expr)
[, PARTITION partition_name VALUES LESS THAN (expr )...]
[, PARTITION partition_name VALUES LESS THAN (MAXVALUE)]
);
在创建 Range 分区时,需要遵循以下规则:
每个分区都有一个
VALUES LESS THAN子句,它为分区指定一个非包含的上限值。分区键的任何值等于或大于这个值时将被映射到下一个分区中。Range 分区的分区键不能是表达式。
除第一个分区外,所有分区都隐含一个下限值,即上一个分区的上限值。
仅允许最后一个分区的上限定义为
MAXVALUE,这个值没有具体的数值,并且比其他所有分区的上限都要大,也包含空值。如果最后一个 Range 分区指定了MAXVALUE,则不能新增分区。
参数解释
| 参数 | 描述 |
|---|---|
| table_name | 指定表名。 |
| column_name | 指定列名称。 |
| column_type | 指定列的数据类型。 |
| partition_name | 指定一级分区名称。 |
示例
创建一个 Range 分区表 tbl1_log_r。
obclient> CREATE TABLE tbl1_log_r(log_id INT,log_date DATE NOT NULL DEFAULT SYSDATE)
PARTITION BY RANGE(log_date)
(PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD'))
, PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD'))
, PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD'))
, PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD'))
, PARTITION M202005 VALUES LESS THAN(TO_DATE('2020/06/01','YYYY/MM/DD'))
, PARTITION M202006 VALUES LESS THAN(TO_DATE('2020/07/01','YYYY/MM/DD'))
, PARTITION M202007 VALUES LESS THAN(TO_DATE('2020/08/01','YYYY/MM/DD'))
, PARTITION M202008 VALUES LESS THAN(TO_DATE('2020/09/01','YYYY/MM/DD'))
, PARTITION M202009 VALUES LESS THAN(TO_DATE('2020/10/01','YYYY/MM/DD'))
, PARTITION M202010 VALUES LESS THAN(TO_DATE('2020/11/01','YYYY/MM/DD'))
, PARTITION M202011 VALUES LESS THAN(TO_DATE('2020/12/01','YYYY/MM/DD'))
, PARTITION M202012 VALUES LESS THAN(TO_DATE('2021/01/01','YYYY/MM/DD'))
, PARTITION MMAX VALUES LESS THAN (MAXVALUE)
);
Query OK, 0 rows affected
创建 List 类型的一级分区表
语法
CREATE TABLE table_name (column_name column_type[,column_name column_type])
PARTITION BY LIST (column_name [,column_name])
(PARTITION partition_name VALUES ( v01 [, v0N])
[,PARTITION partition_name VALUES ( vN1 [, vNN])]
[,PARTITION partition_name VALUES (DEFAULT)]
);
说明
- List 分区不能是表达式。
- 如果最后一个 List 分区指定了
DEFAULT,则不能新增分区。
参数解释
| 参数 | 描述 |
|---|---|
| table_name | 指定表名。 |
| column_name | 指定列名称。 |
| column_type | 指定列的数据类型。 |
| partition_name | 指定分区名称。 |
| DEFAULT | 仅允许最后一个分区指定这个值,这个值没有具体的数值,并且比其他所有分区的上限都要大,也包含空值。 |
示例
创建一个 List 分区表 tbl1_log_l。
obclient> CREATE TABLE tbl1_log_l(log_id INT,log_value VARCHAR2(20))
PARTITION BY LIST(log_value)
(PARTITION P01 VALUES ('A'),
PARTITION P02 VALUES ( 'B' ),
PARTITION P03 VALUES ( 'C' )
);
Query OK, 0 rows affected
创建 Hash 类型的一级分区表
语法
CREATE TABLE table_name (column_name column_type[,column_name column_type])
PARTITION BY HASH(column_name [,column_name]) PARTITIONS partition_count;
参数解释
| 参数 | 描述 |
|---|---|
| table_name | 指定表名。 |
| column_name | 指定列名。 |
| column_type | 指定列的数据类型。 |
| partition_count | 指定一级分区个数。 |
说明
对于 Hash 分区,创建时如果没有指定分区的名字,分区的命名由系统根据命名规则完成。对于一级分区表,则每个分区分别命名为 p0、p1、...、pn。
示例
创建一个 Hash 分区表 tbl1_h。
obclient> CREATE TABLE tbl1_h(col1 INT,col2 VARCHAR(50))
PARTITION BY HASH(col1) PARTITIONS 60;
Query OK, 0 rows affected
创建模板化二级分区表
Oracle 模式下,创建模板化二级分区表的 SQL 语法如下:
CREATE TABLE [IF NOT EXISTS] table_name(column_option_list) partition_option_list;
column_option_list:
column_name column_type [, column_name column_type]
partition_option_list:
PARTITION BY
RANGE(column_name){subpartition_option} (range_partition_list)
| LIST(expression){subpartition_option} (list_partition_list)
| HASH(expression){subpartition_option} { (hash_partition_list)
| PARTITIONS partition_count }
subpartition_option:
SUBPARTITION BY
RANGE(column_name) SUBPARTITION TEMPLATE(range_subpartition_list)
| LIST(expression) SUBPARTITION TEMPLATE(list_subpartition_list)
| HASH(expression) { SUBPARTITION TEMPLATE (hash_subpartition_list)
| SUBPARTITIONS subpartition_count }
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name VALUES LESS THAN {(expression_list) | MAXVALUE}
range_subpartition_list:
range_subpartition [, range_subpartition ...]
range_subpartition:
SUBPARTITION subpartition_name VALUES LESS THAN {(expression_list) | MAXVALUE}
list_partition_list:
list_partition [, list_partition ...]
list_partition:
PARTITION partition_name VALUES {(expression_list) | DEFAULT}
list_subpartition_list:
list_subpartition [, list_subpartition ...]
list_subpartition:
SUBPARTITION subpartition_name VALUES {(expression_list) | DEFAULT}
hash_partition_list:
hash_partition [, hash_partition ...]
hash_partition:
PARTITION partition_name
hash_subpartition_list:
hash_subpartition [, hash_subpartition ...]
hash_subpartition:
SUBPARTITION subpartition_name
expression_list:
expression [, expression ...]
column_name_list:
column_name [, column_name ...]
partition_count | subpartition_count:
INT_VALUE
说明
- 模板化二级分区表的每个一级分区下的二级分区都按照模板中的二级分区定义,即每个一级分区下的二级分区的定义均相同。
- 对于模板化二级分区表来说,二级分区的命名规则为
($part_name)s($subpart_name)。
例如:对于下⾯的 t_range_range 表,p0下的 3 个二级分区的分区名分别为 p0smp1、p0smp2、p0smp3。
obclient> CREATE TABLE t_range_range(col1 INT,col2 INT)
PARTITION BY RANGE(col1)
SUBPARTITION BY RANGE(col2)
SUBPARTITION TEMPLATE
(SUBPARTITION mp1 VALUES LESS THAN(100),
SUBPARTITION mp2 VALUES LESS THAN(200),
SUBPARTITION mp3 VALUES LESS THAN(300)
)
(PARTITION p0 VALUES LESS THAN(2020),
PARTITION p1 VALUES LESS THAN(2021),
PARTITION p2 VALUES LESS THAN(2022)
);
Query OK, 0 rows affected
obclient> SELECT table_name,partition_name,subpartition_name FROM USER_TAB_SUBPARTITIONS;
+---------------+----------------+-------------------+
| TABLE_NAME | PARTITION_NAME | SUBPARTITION_NAME |
+---------------+----------------+-------------------+
| T_RANGE_RANGE | P0 | P0SMP1 |
| T_RANGE_RANGE | P0 | P0SMP2 |
| T_RANGE_RANGE | P0 | P0SMP3 |
| T_RANGE_RANGE | P1 | P1SMP1 |
| T_RANGE_RANGE | P1 | P1SMP2 |
| T_RANGE_RANGE | P1 | P1SMP3 |
| T_RANGE_RANGE | P2 | P2SMP1 |
| T_RANGE_RANGE | P2 | P2SMP2 |
| T_RANGE_RANGE | P2 | P2SMP3 |
+---------------+----------------+-------------------+
9 rows in set
部分参数说明如下表所示。
| 参数 | 说明 |
|---|---|
| table_name | 指定表名。 |
| column_name | 指定列名。 |
| column_type | 指定列数据类型。 |
| partition_name | 指定一级分区的名称。 |
| subpartition_name | 指定二级分区的名称。 |
| INT_VALUE | 指定 Hash 类型的二级分区的个数。 |
创建 Range + Range 分区的模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_m_rr(col1 INT,col2 INT)
PARTITION BY RANGE(col1)
SUBPARTITION BY RANGE(col2)
SUBPARTITION TEMPLATE
(SUBPARTITION mp0 VALUES LESS THAN(2020),
SUBPARTITION mp1 VALUES LESS THAN(2021),
SUBPARTITION mp2 VALUES LESS THAN(2022)
)
(PARTITION p0 VALUES LESS THAN(100),
PARTITION p1 VALUES LESS THAN(200)
);
Query OK, 0 rows affected
创建 Range + List 分区的模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_m_rl(col1 INT,col2 VARCHAR2(50))
PARTITION BY RANGE(col1)
SUBPARTITION BY LIST(col2)
SUBPARTITION TEMPLATE
(SUBPARTITION mp0 VALUES('01'),
SUBPARTITION mp1 VALUES('02'),
SUBPARTITION mp2 VALUES('03')
)
(PARTITION p0 VALUES LESS THAN(100),
PARTITION p1 VALUES LESS THAN(200)
);
Query OK, 0 rows affected
创建 Range + Hash 分区的模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_m_rh(col1 INT,col2 VARCHAR2(50))
PARTITION BY RANGE(col1)
SUBPARTITION BY HASH(col2) SUBPARTITIONS 5
(PARTITION p0 VALUES LESS THAN(100),
PARTITION p1 VALUES LESS THAN(200)
);
Query OK, 0 rows affected
创建 List + Range 分区的模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_m_lr(col1 INT,col2 varchar2(50))
PARTITION BY LIST(col2)
SUBPARTITION BY RANGE(col1)
SUBPARTITION TEMPLATE
(SUBPARTITION mp0 VALUES LESS THAN(100),
SUBPARTITION mp1 VALUES LESS THAN(200),
SUBPARTITION mp2 VALUES LESS THAN(300)
)
(PARTITION p0 VALUES('01'),
PARTITION p1 VALUES('02')
);
Query OK, 0 rows affected
创建 List + List 分区的模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_m_ll(col1 INT,col2 varchar2(50))
PARTITION BY LIST(col1)
SUBPARTITION BY LIST(col2)
SUBPARTITION TEMPLATE
(SUBPARTITION mp0 VALUES('A'),
SUBPARTITION mp1 VALUES('B'),
SUBPARTITION mp2 VALUES('C')
)
(PARTITION p0 VALUES('01'),
PARTITION p1 VALUES('02')
);
Query OK, 0 rows affected
创建 List + Hash 分区的模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_m_lh(col1 INT,col2 VARCHAR2(50))
PARTITION BY LIST(col1)
SUBPARTITION BY HASH(col2) SUBPARTITIONS 5
(PARTITION p0 VALUES('01'),
PARTITION p1 VALUES('02')
);
Query OK, 0 rows affected
创建 Hash + Range 分区的模板化二级分区表
示例如下:
obclient> CREATE TABLE tbl2_m_hr(col1 INT,col2 INT,col3 INT)
PARTITION BY HASH(col1)
SUBPARTITION BY RANGE(col2)
SUBPARTITION TEMPLATE
(SUBPARTITION sp0 VALUES LESS THAN(100),
SUBPARTITION sp1 VALUES LESS THAN(200),
SUBPARTITION sp2 VALUES LESS THAN(300)
)
PARTITIONS 5;
Query OK, 0 rows affected
创建 Hash + List 分区的模板化二级分区表
示例如下:
obclient> CREATE TABLE tbl2_m_hl(col1 INT,col2 INT,col3 INT)
PARTITION BY HASH(col1)
SUBPARTITION BY LIST(col2)
SUBPARTITION TEMPLATE
(SUBPARTITION sp0 VALUES(100),
SUBPARTITION sp1 VALUES(200),
SUBPARTITION sp2 VALUES(300)
)
PARTITIONS 5;
Query OK, 0 rows affected
创建 Hash +Hash 分区的模板化二级分区表
示例如下:
obclient> CREATE TABLE tbl2_m_hh(col1 INT,col2 INT,col3 INT)
PARTITION BY HASH(col1)
SUBPARTITION BY HASH(col2)
SUBPARTITIONS 3
PARTITIONS 5;
Query OK, 0 rows affected
创建非模板化二级分区表
Oracle 模式下,创建非模板化二级分区表的 SQL 语法如下:
CREATE TABLE [IF NOT EXISTS] table_name(column_option_list) partition_option_list;
column_option_list:
column_name column_type [, column_name column_type]
partition_option_list:
PARTITION BY
RANGE(column_name){subpartition_option}
{ range_partition_option (subpartition_option_list)
[, range_partition_option (subpartition_option_list) ...]
}
| LIST(expression){subpartition_option}
{ list_partition_option (subpartition_option_list)
[, list_partition_option (subpartition_option_list) ...]
}
| HASH(expression) {subpartition_option}
{ hash_partition_option (subpartition_option_list)
[, hash_partition_option (subpartition_option_list) ...]
}
subpartition_option:
SUBPARTITION BY { RANGE(column_name) | LIST(expression) | HASH(expression) }
subpartition_option_list:
range_partition_option_list | list_partition_option_list | hash_partition_option_list
range_partition_option_list:
range_partition_option [, range_partition_option ...]
list_partition_option_list:
list_partition_option [, list_partition_option ...]
hash_partition_option_list:
hash_partition_option [, hash_partition_option ...]
range_partition_option:
SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr
[,SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr ...]
list_partition_option:
SUBPARTITION subpartition_name VALUES list_partition_expr
[, SUBPARTITION subpartition_name VALUES list_partition_expr ...]
hash_partition_option_list:
SUBPARTITION subpartition_name
[, SUBPARTITION subpartition_name ...]
说明
非模板化二级分区表的每个一级分区下的二级分区均可以自由定义,即每个一级分区下的二级分区的定义可以相同也可以不同。
部分参数说明如下表所示。
| 参数 | 说明 |
|---|---|
| table_name | 指定表名。 |
| column_name | 指定列名。 |
| column_type | 指定列数据类型。 |
| partition_name | 指定一级分区的名称。 |
| subpartition_name | 指定二级分区的名称。 |
创建 Range + Range 分区的非模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_f_rr(col1 INT,col2 INT)
PARTITION BY RANGE(col1)
SUBPARTITION BY RANGE(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES LESS THAN(2020),
SUBPARTITION sp1 VALUES LESS THAN(2021)
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp2 VALUES LESS THAN(2020),
SUBPARTITION sp3 VALUES LESS THAN(2021),
SUBPARTITION sp4 VALUES LESS THAN(2022)
)
);
Query OK, 0 rows affected
创建 Range + List 分区的非模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_f_rl(col1 INT,col2 VARCHAR2(50))
PARTITION BY RANGE(col1)
SUBPARTITION BY LIST(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES('01'),
SUBPARTITION sp1 VALUES('02')
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp2 VALUES('01'),
SUBPARTITION sp3 VALUES('02'),
SUBPARTITION sp4 VALUES('03')
)
);
Query OK, 0 rows affected
创建 Range + Hash 分区的非模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_f_rh(col1 INT,col2 VARCHAR2(50))
PARTITION BY RANGE(col1)
SUBPARTITION BY HASH(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0,
SUBPARTITION sp1
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp2,
SUBPARTITION sp3,
SUBPARTITION sp4
)
);
Query OK, 0 rows affected
创建 List + Range 分区的非模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_f_lr(col1 INT,col2 VARCHAR2(50))
PARTITION BY LIST(col2)
SUBPARTITION BY RANGE(col1)
(PARTITION p0 VALUES('01')
(SUBPARTITION sp0 VALUES LESS THAN(100),
SUBPARTITION sp1 VALUES LESS THAN(200)
),
PARTITION p1 VALUES('02')
(SUBPARTITION sp2 VALUES LESS THAN(100),
SUBPARTITION sp3 VALUES LESS THAN(200),
SUBPARTITION sp4 VALUES LESS THAN(300)
)
);
Query OK, 0 rows affected
创建 List + List 分区的非模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_f_ll(col1 INT,col2 varchar2(50))
PARTITION BY LIST(col1)
SUBPARTITION BY LIST(col2)
(PARTITION p0 VALUES ('01', '02')
(SUBPARTITION sp0 VALUES ('A'),
SUBPARTITION sp1 VALUES ('B'),
SUBPARTITION sp2 VALUES ('C')
)
,
PARTITION p1 VALUES ('03', '04')
(SUBPARTITION sp3 VALUES ('A'),
SUBPARTITION sp4 VALUES ('B'),
SUBPARTITION sp5 VALUES ('C')
)
);
Query OK, 0 rows affected
创建 List +Hash 分区的非模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_f_lh(col1 INT,col2 VARCHAR2(50))
PARTITION BY LIST(col1)
SUBPARTITION BY HASH(col2)
(PARTITION p0 VALUES('01')
(SUBPARTITION sp0,
SUBPARTITION sp1
),
PARTITION p1 VALUES('02')
(SUBPARTITION sp2,
SUBPARTITION sp3,
SUBPARTITION sp4
)
);
Query OK, 0 rows affected
创建 Hash + Range 分区的非模板化二级分区表
示例如下:
obclient> CREATE TABLE tbl2_f_hr(col1 INT,col2 INT,col3 INT)
PARTITION BY HASH(col1)
SUBPARTITION BY RANGE(col2)
(PARTITION p0
(SUBPARTITION sp0 VALUES LESS THAN(100),
SUBPARTITION sp1 VALUES LESS THAN(200)),
PARTITION p1
(SUBPARTITION sp2 VALUES LESS THAN(100),
SUBPARTITION sp3 VALUES LESS THAN(200)
)
);
Query OK, 0 rows affected
创建 Hash + List 分区的非模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_f_hl(col1 INT,col2 INT,col3 INT)
PARTITION BY HASH(col1)
SUBPARTITION BY LIST(col2)
(PARTITION p0
(SUBPARTITION sp0 VALUES(1,3),
SUBPARTITION sp1 VALUES(4,7)
),
PARTITION p1
(SUBPARTITION sp2 VALUES(1,3),
SUBPARTITION sp3 VALUES(4,7)
)
);
Query OK, 0 rows affected
创建 Hash + Hash 分区的非模板化二级分区表
示例如下:
obclient> CREATE TABLE t2_f_hh(col1 INT,col2 INT,col3 INT)
PARTITION BY HASH(col1)
SUBPARTITION BY HASH(col2)
(PARTITION p0
(SUBPARTITION sp0,
SUBPARTITION sp1
),
PARTITION p1
(SUBPARTITION sp2,
SUBPARTITION sp3
)
);
Query OK, 0 rows affected