一、范围分区
范围分区是按照分区列值的范围来对表进行分区的。
通过PARTITION BY RANGE子句说明根据范围进行分区,其后括号中列出分区列。
每个分区以PARTITION关键字开头,其后是分区名。VALUES LESS THAN子句用于设置分区中分区列值的范围。
---创建一个分区表,将学生信息根据其出生日期进行分区---
CREATE TABLE student_range(
sno NUMBER(6) PRIMARY KEY, sname
VARCHAR2(10), sage int, birthday DATE
)
PARTITION BY RANGE(birthday)
( PARTITION p1 VALUES LESS THAN
(TO_DATE('XXXX-X-X', 'YYYY-MM-DD'))
TABLESPACE TBS1,
PARTITION p2 VALUES LESS THAN
(TO_DATE('XXXX-X-X', 'YYYY-MM-DD'))
TABLESPACE TBS2,
PARTITION p3 VALUES LESS THAN(MAXVALUE)
TABLESPACE TBS3 STORAGE(INITIAL
10M NEXT 20M))
STORAGE(INITIAL 20M NEXT 10M MAXEXTENTS 10
);
二、列表分区
如果分区列的值并不能划分范围(非数值类型或日期类型),同时分区列的取值范围只是一个包含少数值的集合,则可以对表进行列表分区(LIST),如按地区、性别等分区。
通过PARTITION BY LIST子句说明根据列表进行分区,其后括号中列出分区列。
每个分区以PARTITION 关键字开头,其后是分区名。VALUES子句用于设置分区所对应的分区列取值。
创建一个分区表,将学生信息按性别不同进行分区,男学生信息保存在表空间TBS1中,而女学生信息保存在TBS2中。
CREATE TABLE student_list(
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10),
sex CHAR(2) CHECK(sex in ('M', 'F'))
)
PARTITION BY LIST(sex)
(PARTITION student_male VALUES('M') TABLESPACE TBS1,
PARTITION student_female VALUES('F') TABLESPACE TBS2
);
三、散列分区
散列分区(HASH)是在指定数量的分区中均等地分配数据。为了创建散列分区,需要指定分区列、分区数量或单独的分区描述。
通过PARTITION BY HASH指定分区方法,其后的括号指定分区列。使用PARTITION子句指定每个分区名称和其存储空间。或者使用PARTITIONS子句指定分区数量,用STORE IN子句指定分区存储空间。
创建一个分区表,根据学号将学生信息均匀分布到TBS1和TBS2两个表空间中。
①使用PARTITION子句指定每个分区名称和其存储空间
CREATE TABLE student_hash (
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10)
)
PARTITION BY HASH(sno)
(PARTITION p1 TABLESPACE TBS1,
PARTITION p2 TABLESPACE TBS2
);
②使用PARTITIONS子句指定分区数量,用STORE IN子句指定分区存储空间
CREATE TABLE student_hash2 (
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10) )
PARTITION BY HASH(sno)
PARTITIONS 2 STORE IN(TBS1,TBS2);
四、复合分区
复合分区包括:①范围-列表复合分区 ②范围-散列复合分区。
创建复合分区时需要指定:
分区方法(PARTITION BY RANGE)
分区列
子分区方法(SUBPARTITION BY HASH,SUBPARTITION BY LIST)
子分区列
每个分区中子分区数量或子分区的描述。
①范围-列表复合分区
范围-列表复合分区先对表进行范围分区,然后再对每个分区进行列表分区,即在一个范围分区中创建多个列表子分区。
CREATE TABLE student_range_list(
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10), sex CHAR(2) CHECK(sex IN ('M','F')),
sage NUMBER(4), birthday DATE
)
PARTITION BY RANGE(birthday)
SUBPARTITION BY LIST(sex)
(PARTITION p1 VALUES LESS THAN(TO_DATE('XXXX-X-X', 'YYYY-MM-DD'))
(SUBPARTITION p1_sub1 VALUES('M') TABLESPACE TBS1,
SUBPARTITION p1_sub2 VALUES('F') TABLESPACE TBS2),
PARTITION p2 VALUES LESS THAN(TO_DATE('XXXX-X-X', 'YYYY-MM-DD'))
(SUBPARTITION p2_sub1 VALUES('M') TABLESPACE TBS3,
SUBPARTITION p2_sub2 VALUES('F') TABLESPACE TBS4),
PARTITION p3 VALUES LESS THAN(MAXVALUE) TABLESPACE TBS5
);
②范围-散列复合分区
范围-散列复合分区先对表进行范围分区,然后再对每个分区进行散列分区,即在一个范围分区中创建多个散列子分区。
CREATE TABLE student_range_hash(
sno NUMBER(6) PRIMARY KEY,
sname VARCHAR2(10),
sage NUMBER(4),
birthday DATE
)
PARTITION BY RANGE(birthday)
SUBPARTITION BY HASH(sage)
(PARTITION p1 VALUES LESS THAN(TO_DATE('XXXX-X-X', 'YYYY-MM-DD'))
(SUBPARTITION p1_sub1 TABLESPACE TBS1,
SUBPARTITION p1_sub2 TABLESPACE TBS2),
PARTITION p2 VALUES LESS THAN(TO_DATE('XXXX-X-X', 'YYYY-MM-DD'))
(SUBPARTITION p2_sub1 TABLESPACE TBS3,
SUBPARTITION p2_sub2 TABLESPACE TBS4),
PARTITION p3 VALUES LESS THAN(MAXVALUE) TABLESPACE TBS5
);