基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
创建一级分区表
更新时间:2024-08-02 09:57:24
本文介绍了一级分区表的创建方法和相关事项。
概述
支持一级分区表的类型包括:Range、List、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子句,它为分区指定一个非包含的上限值。分区键的任何值等于或大于这个值时将被映射到下一个分区中。- 除第一个分区外,所有分区都隐含一个下限值,即上一个分区的上限值。
- 仅允许最后一个分区的上限定义为
MAXVALUE,这个值没有具体的数值,并且比其他所有分区的上限都要大,也包含空值。如果最后一个 Range 分区指定了MAXVALUE,则不能新增分区。
参数解释
| 参数 | 描述 |
|---|---|
| table_name | 指定表名。 |
| column_name | 指定列名称。 |
| column_type | 指定列的数据类型。 |
| partition_name | 指定一级分区名称。 |
示例
创建一个 RANGE 分区表。
创建
tbl1_log_r分区表。obclient> CREATE TABLE tbl1_log_r(log_id NUMBER,log_date DATE NOT NULL DEFAULT SYSDATE) PARTITION BY RANGE(log_date) (PARTITION M197001 VALUES LESS THAN(TO_DATE('1970/02/01','YYYY/MM/DD')) , PARTITION M197002 VALUES LESS THAN(TO_DATE('1970/03/01','YYYY/MM/DD')) , PARTITION M197003 VALUES LESS THAN(TO_DATE('1970/04/01','YYYY/MM/DD')) , PARTITION M197004 VALUES LESS THAN(TO_DATE('1970/05/01','YYYY/MM/DD')) , PARTITION M197005 VALUES LESS THAN(TO_DATE('1970/06/01','YYYY/MM/DD')) , PARTITION M197006 VALUES LESS THAN(TO_DATE('1970/07/01','YYYY/MM/DD')) , PARTITION M197007 VALUES LESS THAN(TO_DATE('1970/08/01','YYYY/MM/DD')) , PARTITION M197008 VALUES LESS THAN(TO_DATE('1970/09/01','YYYY/MM/DD')) , PARTITION M197009 VALUES LESS THAN(TO_DATE('1970/10/01','YYYY/MM/DD')) , PARTITION M197010 VALUES LESS THAN(TO_DATE('1970/11/01','YYYY/MM/DD')) , PARTITION M197011 VALUES LESS THAN(TO_DATE('1970/12/01','YYYY/MM/DD')) , PARTITION M197012 VALUES LESS THAN(TO_DATE('1971/01/01','YYYY/MM/DD')) , PARTITION MMAX VALUES LESS THAN (MAXVALUE) ); Query OK, 0 rows affected查看
tbl1_log_r分区表。obclient> SHOW CREATE TABLE tbl1_log_r\G *************************** 1. row *************************** TABLE: TBL1_LOG_R CREATE TABLE: CREATE TABLE "TBL1_LOG_R" ( "LOG_ID" NUMBER(38), "LOG_DATE" DATE DEFAULT sysdate NOT NULL ENABLE ) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by range(log_date) (partition M197001 values less than (TO_DATE('1970-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197002 values less than (TO_DATE('1970-03-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197003 values less than (TO_DATE('1970-04-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197004 values less than (TO_DATE('1970-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197005 values less than (TO_DATE('1970-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197006 values less than (TO_DATE('1970-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197007 values less than (TO_DATE('1970-08-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197008 values less than (TO_DATE('1970-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197009 values less than (TO_DATE('1970-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197010 values less than (TO_DATE('1970-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197011 values less than (TO_DATE('1970-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition M197012 values less than (TO_DATE('1971-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')), partition MMAX values less than (MAXVALUE)) 1 row in set向
tbl1_log_r表插入数据。obclient> INSERT INTO tbl1_log_r VALUES (1,date'1970-11-11'); Query OK, 1 row affected查看数据落入的分区。
obclient> SELECT * FROM tbl1_log_r partition(M197011); +--------+-----------+ | LOG_ID | LOG_DATE | +--------+-----------+ | 1 | 11-NOV-70 | +--------+-----------+ 1 row in set
创建 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 | 指定分区名称。 |
| DEFAULTv | 仅允许最后一个分区指定这个值,这个值没有具体的数值,并且比其他所有分区的上限都要大,也包含空值。 |
示例
创建一个 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查看
tbl1_log_l分区表。obclient> SHOW CREATE TABLE tbl1_log_l\G *************************** 1. row *************************** TABLE: TBL1_LOG_L CREATE TABLE: CREATE TABLE "TBL1_LOG_L" ( "LOG_ID" NUMBER(38), "LOG_VALUE" VARCHAR2(20) ) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by list(log_value) (partition P01 values ('A'), partition P02 values ('B'), partition P03 values ('C')) 1 row in set向
tbl1_log_l表插入数据。obclient> INSERT INTO tbl1_log_l VALUES (1,'A'); Query OK, 1 row affected查看数据落入的分区。
obclient> SELECT * FROM tbl1_log_l partition(P01); +--------+-----------+ | LOG_ID | LOG_VALUE | +--------+-----------+ | 1 | A | +--------+-----------+ 1 row in set
创建 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 分区表。
创建
tbl1_h分区表。obclient> CREATE TABLE tbl1_h(col1 INT,col2 VARCHAR(50)) PARTITION BY HASH(col1) PARTITIONS 60; Query OK, 0 rows affected查看
tbl1_h分区表。obclient> SHOW CREATE TABLE tbl1_h\G *************************** 1. row *************************** TABLE: TBL1_H CREATE TABLE: CREATE TABLE "TBL1_H" ( "COL1" NUMBER(38), "COL2" VARCHAR2(50) ) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 partition by hash(col1) (partition P0, partition P1, partition P2, partition P3, partition P4, partition P5, partition P6, partition P7, partition P8, partition P9, partition P10, partition P11, partition P12, partition P13, partition P14, partition P15, partition P16, partition P17, partition P18, partition P19, partition P20, partition P21, partition P22, partition P23, partition P24, partition P25, partition P26, partition P27, partition P28, partition P29, partition P30, partition P31, partition P32, partition P33, partition P34, partition P35, partition P36, partition P37, partition P38, partition P39, partition P40, partition P41, partition P42, partition P43, partition P44, partition P45, partition P46, partition P47, partition P48, partition P49, partition P50, partition P51, partition P52, partition P53, partition P54, partition P55, partition P56, partition P57, partition P58, partition P59) 1 row in set向
tbl1_h表插入数据。obclient> INSERT INTO tbl1_h VALUES (1,'一'); Query OK, 1 row affected查看数据落入的分区。
obclient> SELECT * FROM tbl1_h partition(P1); +------+------+ | COL1 | COL2 | +------+------+ | 1 | 一 | +------+------+ 1 row in set
后续操作
创建一级分区后,您可以对一级分区进行管理,例如:添加一级分区、删除一级分区、Truncate 一级分区等。分区管理的详细操作,请参见 管理一级分区表。