5、表分区(创建分区表)

1、范围分区
【例】按入职日期进行范围分区CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION  BY  RANGE (HIREDATE)
(
PARTITION  part1 VALUES  LESS  THAN (TO_DATE('1981-1-1','YYYY/MM/DD')) TABLESPACE CUS_TS01, --①
PARTITION  part2 VALUES  LESS  THAN (TO_DATE('1982-1-1','YYYY/MM/DD')) TABLESPACE CUS_TS02,
PARTITION  part3 VALUES  LESS  THAN (TO_DATE('1983-1-1','YYYY/MM/DD')) TABLESPACE CUS_TS03, 
PARTITION  part4 VALUES  LESS  THAN (TO_DATE('1988-1-1','YYYY/MM/DD')) TABLESPACE CUS_TS04, 
PARTITION  part5 VALUES  LESS  THAN (MAXVALUE) TABLESPACE CUS_TS05
)
 
2.列表分区:
【例】按DEPTNO进行LIST分区CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY LIST (DEPTNO)
(
PARTITION MYEMP_DEPTNO_10  VALUES (10),
PARTITION MYEMP_DEPTNO_20  VALUES (20) ,
PARTITION MYEMP_DEPTNO_30  VALUES (30) , 
PARTITION MYEMP_DEPTNO_40  VALUES (40) 
)
 
3.散列分区:
CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY HASH (COL) 
( 
PARTITION PART01 TABLESPACE HASH_TS01, 
PARTITION PART02 TABLESPACE HASH_TS02, 
PARTITION PART03 TABLESPACE HASH_TS03 
)
简写:
CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY  HASH (empno) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
 
4.组合分区(组合范围散列分区)
基于 范围分区 和 列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区【例】按入职日期进行范围分区,再按DEPTNO进行LIST子分区CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
PARTITION BY RANGE(HIREDATE) SUBPARTITION BY LIST (DEPTNO)
(
PARTITION P1 VALUES LESS THAN(TO_DATE('1981-01-01','YYYY-MM-DD'))
(
SUBPARTITION P1A VALUES (10) ,
SUBPARTITION P1B VALUES (20),
SUBPARTITION P1C VALUES (30),
SUBPARTITION P1D VALUES (40)
),
PARTITION P2 VALUES LESS THAN (TO_DATE('1982-01-01','YYYY-MM-DD'))
(
SUBPARTITION P2A VALUES (10) ,
SUBPARTITION P2B VALUES (20),
SUBPARTITION P2C VALUES (30),
SUBPARTITION P2D VALUES (40)
),
PARTITION P3 VALUES LESS THAN (TO_DATE('1983-01-01','YYYY-MM-DD'))
(
SUBPARTITION P3A VALUES (10) ,
SUBPARTITION P3B VALUES (20),
SUBPARTITION P3C VALUES (30),
SUBPARTITION P3D VALUES (40)
),
PARTITION P4 VALUES LESS THAN (TO_DATE('1988-01-01','YYYY-MM-DD'))
(
SUBPARTITION P4A VALUES (10) ,
SUBPARTITION P4B VALUES (20),
SUBPARTITION P4C VALUES (30),
SUBPARTITION P4D VALUES (40)
)
)
5.复合分区(复合范围散列分区)
基于 范围分区 和 散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区CREATE TABLE 表名 (列名 数据类型 [,列名 数据类型]...)
partition by range(transaction_date) subpartition by hash(transaction_id) 
subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03) 
( 
partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)), 
partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)), 
partition part_03 values less than(maxvalue) 
);
 
1)添加分区
以下代码给表添加了一个P3分区ALTER TABLE 表名 ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));  
注意:以上添加的分区界限应该高于最后一个分区界限。 
以下代码给表的P3分区添加了一个P3SUB1子分区ALTER TABLE 表名 MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
 
2)删除分区
以下代码删除了P3表分区:ALTER TABLE 表名 DROP PARTITION P3; 
 
在以下代码删除了P4SUB1子分区:ALTER TABLE 表名 DROP SUBPARTITION P4SUB1; 
注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。 
3)截断分区
截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:ALTER TABLE 表名 TRUNCATE PARTITION P2;
 
通过以下代码截断子分区:ALTER TABLE 表名 TRUNCATE SUBPARTITION P2SUB2; 
 
4)合并分区
合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:ALTER TABLE 表名 MERGE PARTITIONS P1,P2 INTO PARTITION P2;
 
5)拆分分区
拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。ALTER TABLE 表名 SBLIT PARTITION 分区名 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);  
6)接合分区(coalesca)
结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区:ALTER TABLE 表名 COALESCA PARTITION;
 
7)重命名表分区
以下代码将P21更改为P2
ALTER TABLE 表名 RENAME PARTITION P21 TO P2;