摘自:http://wenku.baidu.com/view/a042798a680203d8ce2f24ac.html
一、分区表的分类
1、Range分区表(范围分区表)
范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。如根据序号分区,根据业务记录的创建日期进行分区等。
2、Hash分区表(散列分区表)
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
3、List分区表(列表分区表)
该分区的特点是某列的值只有几个,基于这样的特点我们可以采用列表分区。
4、Range—Hash分区表(范围—散列分区表)(复合分区表)
5、Range—List分区表(范围—列表分区表)(复合分区表)
二、创建分区表
1、创建范围分区表
create table Test_Table
(
ID integer not null,
Name nvarchar2(100) not null,
InsertedTime date not null
)
partition by range(InsertedTime)
(
partition Test_Table_Partition1 values less than(to_date('2013-09-06','yyyy-mm-dd')) tablespace Test_Tspace1,
partition Test_Table_Partition2 values less than(to_date('2013-10-06','yyyy-mm-dd')) tablespace Test_Tspace2,
partition Test_Table_Partition3 values less than(to_date('2013-11-06','yyyy-mm-dd')) tablespace Test_Tspace2
);
2、创建散列分区表
CREATE TABLE HASH_TABLE
(
COL NUMBER(8),
INF VARCHAR2(100)
)
PARTITION BY HASH(COL)
(
PARTITION PART01 TABLESPACE TEST_TSPACE1,
PARTITION PART02 TABLESPACE TEST_TSPACE2
);
可以简写为:
CREATE TABLE HASH_TABLE
(
COL NUMBER(8),
INF VARCHAR2(100)
)
PARTITION BY HASH(COL) PARTITIONS 2
STORE IN (TEST_TSPACE1,TEST_TSPACE2);
3、创建列表分区表
例1:
CREATE TABLE PROBLEM_TICKETS
(
PROBLEM_ID NUMBER(7) NOT NULL PRIMARY KEY,
DESCRIPTION VARCHAR2(2000),
CUSTOMER_ID NUMBER(7) NOT NULL,
DATE_ENTERED DATE NOT NULL,
STATUS VARCHAR2(20)
)
PARTITION BY LIST(STATUS)
(
PARTITION PROB_ACTIVE VALUES('ACTIVE') TABLESPACE TEST_TSPACE1,
PARTITION PROB_INACTIVE VALUES('INACTIVE') TABLESPACE TEST_TSPACE2
);
例2:
CREATE TABLE ListTable
(
id INT PRIMARY KEY ,
name VARCHAR (20),
area VARCHAR (10)
)
PARTITION BY LIST(AREA)
(
PARTITION PART1 VALUES('guangdong','beijing')TABLESPACE TEST_TSPACE1,
PARTITION PART2 VALUES('shanghai','nianjing')TABLESPACE TEST_TSPACE2
);
4、创建范围—列表分区表
CREATE TABLE SALES
(
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE,
SALES_COST NUMBER(10),
STATUS VARCHAR2(20)
)
PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST(STATUS)
(
PARTITION P1 VALUES LESS THAN (TO_DATE('2013-09-07','YYYY-MM-DD')) TABLESPACE TEST_TSPACE1
(
SUBPARTITION P1SUB1 VALUES('ACTIVE') TABLESPACE TEST_TSPACE1,
SUBPARTITION P1SUB2 VALUES('INACTIVE') TABLESPACE TEST_TSPACE1
),
PARTITION P2 VALUES LESS THAN (TO_DATE('2013-10-07','YYYY-MM-DD')) TABLESPACE TEST_TSPACE2
(
SUBPARTITION P2SUB1 VALUES('ACTIVE') TABLESPACE TEST_TSPACE2,
SUBPARTITION P2SUB2 VALUES('INACTIVE') TABLESPACE TEST_TSPACE2
)
)
5、创建范围—散列分区表
create table dinya_test
(
transaction_id number primary key,
item_id number(8) not null,
item_description varchar2(300),
transaction_date date
)
partition by range(transaction_date) subpartition by hash(transaction_id)
subpartitions 2 store in (test_tspace1,test_tspace2)
(
partition part_01 values less than(to_date('2013-09-07','yyyy-mm-dd')),
partition part_02 values less than(to_date('2013-10-07','yyyy-mm-dd'))
);
三、添加表分区
添加表分区:
注:以上添加的分区界限应该高于最后一个分区界限。
alter table sales
add partition p4
values less than (to_date('2013-12-07','yyyy-mm-dd')) tablespace test_tspace3
添加子分区:
alter table sales
modify partition p4
add subpartition p3sub1 values('COMPLETE') tablespace test_tspace3;
四、删除分区
alter table sales drop partition p4;
删除子分区:
alter table sales drop subpartition p2sub1;
注:如果删除的子分区是一个分区中唯一的分区,则此分区不能被删除,要想删除此子分区就必须删除上级分区。
如果删除的分区是一个表中唯一的分区,则此分区不能被删除,要想删除此分区就必须删除表。
五、截断分区
截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:
alter table DINYA_TEST truncate partition part_01;
通过以下代码截断子分区:
ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
六、合并分区
合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并:
alter table DINYA_TEST merge partitions part_01,part_02 into partition p1;
七、拆分分区
拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。
alter table DINYA_TEST
split partition p1
at(to_date('2013-07-07','yyyy-mm-dd'))
into(partition p01,partition p02);
八、结合分区(coalesca)
九、重命名分区表
alter table DINYA_TEST rename partition p01 to p1