您可以根据业务需求,创建相应类型的一级分区表或二级分区表。
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) }
(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 ( expr(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(expr) PARTITIONS partition_count;
参数解释
| 参数 | 描述 |
|---|---|
| table_name | 指定表名。 |
| column_name | 指定列名。 |
| column_type | 指定列的数据类型。 |
| expr | 指定 Hash 分区表达式。 |
| 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「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




