创建和使用分区表
范围分区
以某个范围进行分区,通常采用日期进行范围分区。
有以下几个特性:
1、每个分区都有一个VALUES LESS THEN字句,指定了该分区不包括的上限值。
2、除了第一个分区,其他的每一个分区都有一个下限值,这个值就是此分区的前一个分区的上限值。
3、有一个MAXVALUE分区,来存放于其它分区的值。
示例:
以时间为范围的分区表
范围分区创建表
CREATE TABLE "SYSDBA"."TABLE_DATE_RANGE"
(
"ID" VARCHAR2(10) NOT NULL,
"TRANSACTION_DATE" DATE NOT NULL)
PARTITION BY RANGE("TRANSACTION_DATE")
(
PARTITION "P2020" VALUES LESS THAN(DATE'2021-01-01'),
PARTITION "P2021" VALUES LESS THAN(DATE'2022-01-01'),
PARTITION "P2022" VALUES LESS THAN(DATE'2023-01-01'),
PARTITION "P2023" VALUES LESS THAN(DATE'2024-01-01'),
PARTITION "P2024" VALUES LESS THAN(DATE'2025-01-01')
);
在每个分区后面可以加STORAGE(ON “表空间名”, CLUSTERBTR)来指定表空间,一般用于分布式系统中。
创建时MAXVALUE分区非必须。
插入一条数据:
insert into TABLE_DATE_RANGE values('01',to_date('20240816','yyyymmdd'));commit;
查询指定分区的值:
select * from TABLE_DATE_RANGE PARTITION(P2024);
可以看到刚刚的数据在P2024的分区中。
当插入不属于某一分区的数据时,则会报错没有找到合适的分区:
insert into TABLE_DATE_RANGE values('01',to_date('20260816','yyyymmdd'));commit;
范围分区添加分区:
ALTER TABLE TABLE_DATE_RANGE ADD PARTITION P2025 VALUES LESS THAN(TO_DATE('2026-01-01','YYYY-MM-DD'));
注:添加分区时添加最小的分区会报错范围分区值非递增比如,添加最小分区要通过拆分分区:
ALTER TABLE TABLE_DATE_RANGE ADD PARTITION P2019 VALUES LESS THAN(TO_DATE('2020-01-01','YYYY-MM-DD'));
范围分区删除分区:
ALTER TABLE TABLE_DATE_RANGE DROP PARTITION P2025 ;
范围分区截断分区(即删除分区的值):
ALTER TABLE TABLE_DATE_RANGE TRUNCATE PARTITION P2025;
范围分区拆分分区:
ALTER TABLE TABLE_DATE_RANGE SPLIT PARTITION P2020 AT(TO_DATE('2020-01-01','YYYY-MM-DD')) INTO (PARTITION P2019,PARTITION P2020);
注:拆分时要主要注意,以填写的数值为分界线(‘2020-01-01’,‘YYYY-MM-DD’),写在前面的是小于分界线的,写在后面的是大于分界线的
范围分区合并分区:
合并分区必须两个分区要连续,而且不能合并最小分区,否则会报错:合并分区不能将下界分区作为结果分区重用
ALTER TABLE TABLE_DATE_RANGE MERGE PARTITIONS p2024, p2023 into partition p2023_24;
有MAXVALUE分区。
在创建时,最后一个分区的值写为MAXVALUE
PARTITION “PMAX” VALUES LESS THAN (MAXVALUE)
添加新分区只能通过拆分的方式:
ALTER TABLE TABLE_DATE_RANGE SPLIT PARTITION PMAX AT(TO_DATE('2026-01-01','YYYY-MM-DD')) INTO (PARTITION P2025,PARTITION PMAX);
列表分区
某列的值只有几种,比如班级,性别
通常会有一个默认分区(DEFAULT分区)存放,不是所有分区值的值,默认分区不是必须。
列表分区创建表
CREATE TABLE "SYSDBA"."TABLE_LIST"
(
"NAME" VARCHAR2(10) NOT NULL,
"SEX" int NOT NULL)
PARTITION BY list("SEX")
(
PARTITION MAN VALUES (1),
PARTITION WOMAN VALUES (0)
);
插入一条数据:
insert into TABLE_LIST values('张三',1);commit;
列表分区查看指定分区:
select * from TABLE_LIST PARTITION(MAN);
列表分区添加分区:
ALTER TABLE TABLE_LIST ADD PARTITION ET VALUES (3);
列表分区删除分区:
ALTER TABLE TABLE_LIST DROP PARTITION ET ;
列表分区截断分区(即删除分区的值):
ALTER TABLE TABLE_LIST TRUNCATE PARTITION ET;
列表分区拆分分区:
在列表分区当中,如果拆分分区必须确保分区当中有不同的值,比如在创建过程当中,使用PARTITION MAN VALUES (1,2)
ALTER TABLE TABLE_LIST SPLIT PARTITION OTHER INTO ( PARTITION ET VALUES (3),PARTITION OTHER );
ALTER TABLE TABLE_LIST SPLIT PARTITION MAN INTO ( PARTITION MAN1 VALUES (1),PARTITION MAN2);
列表分区合并分区:
ALTER TABLE TABLE_LIST MERGE PARTITIONS MAN, WOMAN into partition HUMAN;
有DEFAULT分区。
PARTITION OTHER VALUES (DEFAULT)
有DEFAULT分区不能添加分区,添加分区只能通过拆分来获得;
ALTER TABLE TABLE_LIST SPLIT PARTITION OTHER INTO ( PARTITION ET VALUES (3),PARTITION OTHER VALUES(DEFAULT));
哈希分区
哈希分区是通过将数据的值转化为哈希函数来分配到各个分区当中。
哈希分区创建表
CREATE TABLE HASH_TABLE
(
COL NUMBER(8),
INF VARCHAR2(100)
)
PARTITION BY HASH (COL)
(
PARTITION PART01 TABLESPACE HASH_TS01,
PARTITION PART02 TABLESPACE HASH_TS02,
PARTITION PART03 TABLESPACE HASH_TS03
) ;
或者可以使用简化版自动命名分区名:
CREATE TABLE HASH_TABLE02
(
COL NUMBER(8),
INF VARCHAR2(100)
)
PARTITION BY HASH (COL) PARTITIONS 3 ;
哈希分区添加分区:
ALTER TABLE HASH_TABLE ADD PARTITION PART04;
删除分区,拆分分区,合并分区::HASH水平分区表[HASH_TABLE]不支持删除分区操作
ALTER TABLE HASH_TABLE DROP PARTITION PART04 ;
哈希分区截断分区(即删除分区的值):
ALTER TABLE HASH_TABLE TRUNCATE PARTITION PART04;
所以在建立哈希分区的时候,分区数量一定要谨慎对待,只能增加,不能减少。
二级分区表
二级分区表,也称为“子分区表”,是在一级分区的基础上进一步细分的分区策略。它是一种多级分区策略,其中表首先被分为多个一级分区,然后每个一级分区又被细分为多个二级分区。
二级分区创建分区:
下面的分区是先通过UNIT_ID进行列表分区,再通过TRANSACTION_DATE进行时间分区。
CREATE TABLE "SYSDBA"."TRANSACTIONS"
(
"UNIT_ID" VARCHAR2(10) NOT NULL,
"TRANSACTION_DATE" DATE NOT NULL,
"AMOUNT" NUMBER(10,2) NOT NULL)
PARTITION BY LIST("UNIT_ID")
SUBPARTITION BY RANGE("TRANSACTION_DATE")
(
PARTITION "P_01" VALUES('01') STORAGE(ON "TS_2_1", CLUSTERBTR) (
SUBPARTITION "P2020" VALUES LESS THAN(DATE'2021-01-01') STORAGE(ON "TS_2_1", CLUSTERBTR) ,
SUBPARTITION "P2021" VALUES LESS THAN(DATE'2022-01-01') STORAGE(ON "TS_1_2", CLUSTERBTR) ,
SUBPARTITION "P2022" VALUES LESS THAN(DATE'2023-01-01') STORAGE(ON "TS_2_2", CLUSTERBTR) ,
SUBPARTITION "P2023" VALUES LESS THAN(DATE'2024-01-01') STORAGE(ON "TS_1_3", CLUSTERBTR) ,
SUBPARTITION "P2024" VALUES LESS THAN(DATE'2025-01-01') STORAGE(ON "TS_2_3", CLUSTERBTR)
)
,
PARTITION "P_02" VALUES('02') STORAGE(ON "TS_1_2", CLUSTERBTR) (
SUBPARTITION "P2020" VALUES LESS THAN(DATE'2021-01-01') STORAGE(ON "TS_2_1", CLUSTERBTR) ,
SUBPARTITION "P2021" VALUES LESS THAN(DATE'2022-01-01') STORAGE(ON "TS_1_2", CLUSTERBTR) ,
SUBPARTITION "P2022" VALUES LESS THAN(DATE'2023-01-01') STORAGE(ON "TS_2_2", CLUSTERBTR) ,
SUBPARTITION "P2023" VALUES LESS THAN(DATE'2024-01-01') STORAGE(ON "TS_1_3", CLUSTERBTR) ,
SUBPARTITION "P2024" VALUES LESS THAN(DATE'2025-01-01') STORAGE(ON "TS_2_3", CLUSTERBTR)
)
,
PARTITION "P_03" VALUES('03') STORAGE(ON "TS_2_2", CLUSTERBTR) (
SUBPARTITION "P2020" VALUES LESS THAN(DATE'2021-01-01') STORAGE(ON "TS_2_1", CLUSTERBTR) ,
SUBPARTITION "P2021" VALUES LESS THAN(DATE'2022-01-01') STORAGE(ON "TS_1_2", CLUSTERBTR) ,
SUBPARTITION "P2022" VALUES LESS THAN(DATE'2023-01-01') STORAGE(ON "TS_2_2", CLUSTERBTR) ,
SUBPARTITION "P2023" VALUES LESS THAN(DATE'2024-01-01') STORAGE(ON "TS_1_3", CLUSTERBTR) ,
SUBPARTITION "P2024" VALUES LESS THAN(DATE'2025-01-01') STORAGE(ON "TS_2_3", CLUSTERBTR)
)
,
PARTITION "P_04" VALUES('04') STORAGE(ON "TS_1_3", CLUSTERBTR) (
SUBPARTITION "P2020" VALUES LESS THAN(DATE'2021-01-01') STORAGE(ON "TS_2_1", CLUSTERBTR) ,
SUBPARTITION "P2021" VALUES LESS THAN(DATE'2022-01-01') STORAGE(ON "TS_1_2", CLUSTERBTR) ,
SUBPARTITION "P2022" VALUES LESS THAN(DATE'2023-01-01') STORAGE(ON "TS_2_2", CLUSTERBTR) ,
SUBPARTITION "P2023" VALUES LESS THAN(DATE'2024-01-01') STORAGE(ON "TS_1_3", CLUSTERBTR) ,
SUBPARTITION "P2024" VALUES LESS THAN(DATE'2025-01-01') STORAGE(ON "TS_2_3", CLUSTERBTR)
)
,
PARTITION "P_05" VALUES('05') STORAGE(ON "TS_2_3", CLUSTERBTR) (
SUBPARTITION "P2020" VALUES LESS THAN(DATE'2021-01-01') STORAGE(ON "TS_2_1", CLUSTERBTR) ,
SUBPARTITION "P2021" VALUES LESS THAN(DATE'2022-01-01') STORAGE(ON "TS_1_2", CLUSTERBTR) ,
SUBPARTITION "P2022" VALUES LESS THAN(DATE'2023-01-01') STORAGE(ON "TS_2_2", CLUSTERBTR) ,
SUBPARTITION "P2023" VALUES LESS THAN(DATE'2024-01-01') STORAGE(ON "TS_1_3", CLUSTERBTR) ,
SUBPARTITION "P2024" VALUES LESS THAN(DATE'2025-01-01') STORAGE(ON "TS_2_3", CLUSTERBTR)
)
,
PARTITION "P_06" VALUES('06') STORAGE(ON "TS_1_1", CLUSTERBTR) (
SUBPARTITION "P2020" VALUES LESS THAN(DATE'2021-01-01') STORAGE(ON "TS_2_1", CLUSTERBTR) ,
SUBPARTITION "P2021" VALUES LESS THAN(DATE'2022-01-01') STORAGE(ON "TS_1_2", CLUSTERBTR) ,
SUBPARTITION "P2022" VALUES LESS THAN(DATE'2023-01-01') STORAGE(ON "TS_2_2", CLUSTERBTR) ,
SUBPARTITION "P2023" VALUES LESS THAN(DATE'2024-01-01') STORAGE(ON "TS_1_3", CLUSTERBTR) ,
SUBPARTITION "P2024" VALUES LESS THAN(DATE'2025-01-01') STORAGE(ON "TS_2_3", CLUSTERBTR)
)
,
PARTITION "P_07" VALUES('07') STORAGE(ON "TS_2_1", CLUSTERBTR) (
SUBPARTITION "P2020" VALUES LESS THAN(DATE'2021-01-01') STORAGE(ON "TS_2_1", CLUSTERBTR) ,
SUBPARTITION "P2021" VALUES LESS THAN(DATE'2022-01-01') STORAGE(ON "TS_1_2", CLUSTERBTR) ,
SUBPARTITION "P2022" VALUES LESS THAN(DATE'2023-01-01') STORAGE(ON "TS_2_2", CLUSTERBTR) ,
SUBPARTITION "P2023" VALUES LESS THAN(DATE'2024-01-01') STORAGE(ON "TS_1_3", CLUSTERBTR) ,
SUBPARTITION "P2024" VALUES LESS THAN(DATE'2025-01-01') STORAGE(ON "TS_2_3", CLUSTERBTR)
)
) STORAGE(HASHPARTMAP(1), ON "TS_1_1", CLUSTERBTR) ;
分区表相关的视图
--一级分区表视图
SELECT *FROM DBA_TAB_PARTITIONS WHERE TABLE_NAME ='T_PARTITION_HASH';
--二级分区表视图
SELECT *FROM DBA_TAB_SUBPARTITIONS;
--一级分区索引视图
SELECT *FROM DBA_IND_PARTITIONS;
--二级分区索引视图
SELECT *FROM DBA_IND_SUBPARTITIONS;