oracle 分区在数据量小的表里面一般基本用不到,一旦数据到达千万级别,使用分区不仅更为查询效率提高,并且维护方便,均衡IO等。
表空间必须在创建表后立即创建,因此在设计表时,一定要考虑周全,对业务,及数据的结构整理清楚。
分区的几种类型
表分区的类型有以下几种
1. 范围分区
2. 列表分区
3. 散列分区
4. 范围-列表分区(被称为子分区)
5. 范围-散列分区(被称为子分区)
范围分区
范围分区的每个分区都有一个最大值,小于这个最大值的数据都在这个分区里面。
范围分区操作
--1、创建表、创建分区
create table t(c1 number ,c2 number)
partition by range(c1)
(
partition p1 values less than(10000000),
partition p2 values less than(20000000),
partition p3 values less than(30000000)
);
--添加分区
alter table t add partition p4 value less than(4000000);
代码执行第一步的话,则会创建3个分区。
c1 字段小于10000000 的数据则会添加到p1 分区。
c1 字段小于20000000 的数据则会添加到p2 分区。
c1 字段小于30000000 的数据则会添加到p3 分区。
列表分区
列表分区是指定一个字段的固定值,符合字段是数据则会添加到这个分区中。
列表分区操作
--1、创建表、创建分区
create table t(c1 number ,c2 number)
partition by list(c2)
(
partition p1 values(1),
partition p2 values(2),
partition p3 values(3)
);
--2、添加分区
alter table t add partition p4 values(4);
代码执行第一步的话,则会创建3个分区。
c2 字段等于1 的数据则会添加到p1 分区。
c2 字段等于2 的数据则会添加到p2 分区。
c2 字段等于3 的数据则会添加到p3 分区。
散列分区
散列分区也称hash分区,分区没有逻辑。但是它的用处也是不小的,特别适合海量数据及没有规则的数据。
1、创建表、创建分区
create table t(c1 number ,c2 number)
partition by hash(c2)
(
partition p1,
partition p2,
partition p3
);
--2、添加分区
alter table t add partition p4 values(4);
范围列表分区
范围列表分区,也称做为子分区。它的逻辑是将一个范围分区里再次分区为多个列表分区。
--创建表、创建分区
create table t1 (c1 number,c2 date)
partition by range(c2) subpartition by list(c1)(
partition p1 values less than(to_date('2010-01-01','yyyy-mm-dd'))(
subpartition p11 values(1),
subpartition p12 values(2),
subpartition p13 values(3)
),
partition p2 values less than(to_date('2011-01-01','yyyy-mm-dd'))(
subpartition p21 values(1),
subpartition p22 values(2),
subpartition p23 values(3)
)
);
--添加分区
alter table t1 add partition p3 values less than(to_date('2012-01-01','yyyy-mm-dd'))(
subpartition p31 values(1),
subpartition p32 values(2),
subpartition p33 values(3)
)
范围散列分区
此分区与范围列表分区类似,只是子分区不同了。
--创建表,创建分区
create table t2 (c1 number,c2 date)
partition by range(c2) subpartition by hash(c1)(
partition p1 values less than(to_date('2010-01-01','yyyy-mm-dd'))(
subpartition p11,
subpartition p12,
subpartition p13
),
partition p2 values less than(to_date('2011-01-01','yyyy-mm-dd'))(
subpartition p21,
subpartition p22,
subpartition p23
)
);
--添加分区
alter table t2 add partition p3 values less than(to_date('2012-01-01','yyyy-mm-dd'))(
subpartition p31 ,
subpartition p32,
subpartition p33
)