基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
管理一级分区表
更新时间:2025-08-12 16:36:06
分区表创建成功后,您可以对一级分区表进行添加、删除或 Truncate 分区操作。
各类型分区支持操作情况
| 分区类型 | 添加一级分区 | 删除一级分区 | Truncate 一级分区数据 |
|---|---|---|---|
| Range 分区 | 支持 | 支持 | 支持 |
| List 分区 | 支持 | 支持 | 支持 |
| Hash 分区 | 不支持 | 不支持 | 不支持 |
添加一级分区
语法
ALTER TABLE table_name ADD partition_option;
partition_option:
range_partition_option | list_partition_option
range_partition_option:
PARTITION partition_name VALUES LESS THAN partition_expr
list_partition_option:
PARTITION partition_name VALUES partition_expr
说明
- 对于 Range 分区,只能在最大的分区之后添加一个分区,不可以在中间某个或者开始的地方添加。如果当前的分区中有
MAXVALUE的分区,则不能继续添加分区。- List 分区添加一级分区时,要求添加的分区与之前的分区不冲突。如果一个 List 分区有默认分区即
Default Partition,则不能添加任何分区。- 在 Range/List 分区中添加一级分区不会影响全局索引和局部索引的使用。
示例
向 Range 分区中添加一级分区。创建 Range 分区表
tbl1_r,并添加分区M197006。CREATE TABLE tbl1_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')) );在
tbl1_r表中添加分区M197106。obclient> ALTER TABLE tbl1_r ADD PARTITION M197006 VALUES LESS THAN(TO_DATE('1970/07/01','YYYY/MM/DD')); Query OK, 0 rows affected在
tbl1_r表中查看已添加的分区M197106。obclient> SHOW CREATE TABLE tbl1_r\G *************************** 1. row *************************** TABLE: TBL1_R CREATE TABLE: CREATE TABLE "TBL1_R" ( "LOG_ID" NUMBER, "LOG_DATE" DATE DEFAULT sysdate CONSTRAINT "TBL1_R_OBNOTNULL_1650855716241488" 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'))) 1 row in set向
tbl1_r表的M197106分区插入数据。obclient> INSERT INTO tbl1_r VALUES (1,date'1970-06-02'); Query OK, 1 row affected查看数据落入的
M197106分区。obclient> SELECT * FROM tbl1_r partition(M197006); +--------+-----------+ | LOG_ID | LOG_DATE | +--------+-----------+ | 1 | 02-JUN-70 | +--------+-----------+ 1 row in set向 List 分区中添加一级分区。创建 List 分区表
tbl1_l,并添加分区p4。CREATE TABLE tbl1_l(log_id INT,log_value VARCHAR2(20)) PARTITION BY LIST(log_value) (PARTITION p1 VALUES ('A'), PARTITION p2 VALUES ( 'B' ), PARTITION p3 VALUES ( 'C' ) );在
tbl1_l表中添加分区p4。obclient> ALTER TABLE tbl1_l ADD PARTITION p4 VALUES('D'); Query OK, 0 rows affected在
tbl1_l表中查看已添加的分区p4。obclient> SHOW CREATE TABLE tbl1_l\G *************************** 1. row *************************** TABLE: TBL1_L CREATE TABLE: CREATE TABLE "TBL1_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 P1 values ('A'), partition P2 values ('B'), partition P3 values ('C'), partition P4 values ('D')) 1 row in set向
tbl1_l表的p4分区插入数据。obclient> INSERT INTO tbl1_l VALUES(8,'A'); Query OK, 1 row affected查看数据落入的
p2与p3分区。obclient> SELECT * FROM tbl1_l partition(p1); +--------+-----------+ | LOG_ID | LOG_VALUE | +--------+-----------+ | 8 | A | +--------+-----------+ 1 row in set
删除一级分区
语法
ALTER TABLE table_name DROP PARTITION partition_name_list [UPDATE GLOBAL INDEXES];
partition_name_list:
partition_name [, partition_name ...]
说明
- 删除一级分区时,可以删除一个或多个分区,但不能删除全部分区。
- 删除一级分区时,请尽量避免该分区上存在活动的事务或查询,否则可能会导致 SQL 语句报错,或者出现一些异常情况。
- 删除分区时,会同时删除分区中的数据,如果只需要删除数据,则可以使用
TRUNCATE语句。- 对于 Oracle 模式下有全局索引的一级分区表,删除一级分区时,需要通过在
ALTER TABLE语句中添加UPDATE GLOBAL INDEXES关键字的方式来更新全局索引信息。如果未添加UPDATE GLOBAL INDEXES关键字,则删除分区后,该分区表上的全局索引会处于不可用状态。- 删除一级分区时,可以删除一个或多个分区,但不能删除全部分区。
- 删除一级分区时,请尽量避免该分区上存在活动的事务或查询,否则可能会导致 SQL 语句报错,或者出现一些异常情况。
示例
删除一级分区表 tbl1_r 中的 M197105 和 M197106。
查看
tbl1_r分区表。obclient> SHOW CREATE TABLE tbl1_r\G *************************** 1. row *************************** TABLE: TBL1_R CREATE TABLE: CREATE TABLE "TBL1_R" ( "LOG_ID" NUMBER, "LOG_DATE" DATE DEFAULT sysdate CONSTRAINT "TBL1_R_OBNOTNULL_1650855716241488" 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'))) 1 row in set删除一级分区表
tbl1_r中的M197105和M197106。obclient> ALTER TABLE tbl1_r DROP PARTITION M197105,M197106; Query OK, 0 rows affected查看运行结果。
obclient>SHOW CREATE TABLE tbl1_r\G *************************** 1. row *************************** TABLE: TBL1_R CREATE TABLE: CREATE TABLE "TBL1_R" ( "LOG_ID" NUMBER, "LOG_DATE" DATE DEFAULT sysdate CONSTRAINT "TBL1_R_OBNOTNULL_1650855716241488" 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'))) 1 row in set
Truncate 一级分区
语法
ALTER TABLE table_name TRUNCATE PARTITION partition_name_list [UPDATE GLOBAL INDEXES];
partition_name_list:
partition_name [, partition_name ...]
说明
- Truncate 一级分区时,可以将一个或多个分区中的数据清空。
- 在 Truncate 一级分区时,请尽量避免该分区上存在活动的事务或查询,否则可能会导致 SQL 语句报错,或者出现一些异常情况。
- 对于 Oracle 模式下有全局索引的一级分区表,Truncate 分区时,需要通过在
ALTER TABLE语句中添加UPDATE GLOBAL INDEXES关键字的方式来更新全局索引信息。如果未添加UPDATE GLOBAL INDEXES关键字,则 Truncate 分区后,该分区表上的全局索引会处于不可用状态。- Truncate 一级分区时,可以将一个或多个分区中的数据清空。
- 在 Truncate 一级分区时,请尽量避免该分区上存在活动的事务或查询,否则可能会导致 SQL 语句报错,或者出现一些异常情况。
示例
清除一级分区表 tbl1_r 中 M197001 和 M197002 分区的数据并更新全局索引信息。
obclient> ALTER TABLE tbl1_r TRUNCATE PARTITION M197001,M197002 UPDATE GLOBAL INDEXES;
Query OK, 0 rows affected