分区表

来源:互联网 发布:ubuntu 设置mac 编辑:程序博客网 时间:2024/05/16 12:47

为了提高对大型数据库的读写查询速度,Oracle提供了一种分区表技术,分区表是将一个非常大的表分割成较小的片段(分区)。Oracle对表或索引分区的方法有五种:范围分区、散列分区、列表分区、组合范围散列分区、组合范围列表分区。

分区可以改善查询的性能,并且可以使数据量大的表变得容易管理。查询分区表时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法进行查询。

不同的分区可以指定到不同的表空间中,也可以指向同一个表空间。

1)使用range关键字创建范围分区表

根据表中的某个值的范围进行分区, 根据某个值的大小或次序,决定将每条数据分别存储在哪个分区上。

在创建范围分区表之前,首先需要检查当前数据库已经存在的表空间,以便于将不同的分区指定到不同的表空间中。

create table part_book(

bid number(4),

bookname varchar2(30),

bookprice number(4,2),

booktime date

) partition by range(booktime)(

partition part1 values less than('01-1月-2008') tablespace mytemp1,

partition part2 values less than('01-1月-2009') tablespace mytemp2,

partition part3 values less than(maxvalue) tablespace mytemp3);


create table rangge_book(

bid number(4),

bookname varchar2(30),

bookprice number(4,2),

booktime date

) partition by range(booktime)(

partition part1 values less than('01-1月-2008') ,

partition part2 values less than('01-1月-2009'),

partition part3 values less than('01-1月-2010'));


values less than字句用来指定分区的上限(不包含该上限);maxvalue关键字用来表示分区中可能的最大值,一般用于设置最后一个分区的上限。

向表中插入数据时,会根据范围自动分区。

2)使用hash关键字创建散列分区表

散列分区是通过hash算法均匀分布数据的一种分区类型。通过在I/O设备上进行散列分区,可以使得分区的大小一致。

create table part_book(

bid number(4),

bookname varchar2(30),

bookprice number(4,2),

booktime date

)partition by hash(bid)(

partition part1 tablespace mytemp1,

partition part2 tablespace mytemp2);

使用hash分区表可以使表中的数据得到均匀的分配,有助于在某些高并发性的应用程序中消除数据块冲突。

3)使用list关键字创建列表分区表

基于特定值的列表对表进行分区,列表分区适用于分区列的值为非数字或日期数据类型,并且分区列的取值范围较少时使用。

进行列表分区时,需要为每个分区指定一个取值列表,分区列的取值处于同一个列表中的行将被存储到同一个分区中。

create table part_book3(

bid number(4),

bookname varchar2(30),

bookpress varchar2(30),

booktime date

)partition by list(bookpress)(

partition part1 values ('清华大学出版社') tablespace mytemp1,

partition part2 values ('北京大学出版社') tablespace mytemp2);

4)创建组合范围散列分区表

组合范围散列分区,就是将范围分区和散列分区进行组合使用。这种形式首先使用范围值进行分区,然后使用散列值进行分区。

create table part_book4(

bid number(4),

bookname varchar2(30),

bookpress varchar2(30),

booktime date

)partition by range(booktime)

subpartition by hash(bid)

subpartitions 2 store in (mytemp1,mytemp2)(

partition part1 values less than('01-1月-2008'),

partition part2 values less than('01-1月-2009'),

partition part3 values less than(maxvalue);

上述示例中,使用partition by range子句,根据booktime列创建了3个分区(即part1、part2、part3);使用subpartition by hash子句,将每一个分区又基于bid列的hash值将数据均匀分到链两个不同的分区中。

5)创建组合范围列表分区表

组合范围列表分区,就是将范围分区和列表分区结合使用。这种形式首先使用范围值进行分区,然后使用列表值进行分区。

create table part_book5(

bid number(4),

bookname varchar2(30),

bookpress varchar2(30),

booktime date

)partition by range(booktime)

subpartition by list(bookpress)(

partition part1 values less than('01-1月-2008')(

subpartition part1_1 values('清华大学出版社') tablespace mytemp1,

subpartition part1_2 values('北京大学出版社') tablespace mytemp1),

partition part2 values less than('01-1月-2009')(

subpartition part2_1 values('清华大学出版社') tablespace mytemp1,

subpartition part2_2 values('北京大学出版社') tablespace mytemp2),

partition part1 values less than(maxvalue)(

subpartition part3_1 values('清华大学出版社') tablespace mytemp3,

subpartition part3_2 values('北京大学出版社') tablespace mytemp3));

6)增加分区

  • 为范围分区表增加分区

在最后一个分区之后增加分区:

alter table part_book split partition part3 at ('01-1月-2010') into (partition part3 tablespace mytemp1,partition part4 tablespace mytemp2);--创建表时指定了maxvalue值

alter table range_book add partition part4 values less than('01-1月-2011') ;--创建表时没有指定maxvalue值

在分区中间或开始处:

alter table range_book split partition part1 at ('01-1月-2007') into (partition part5,partition part6);

  • 为散列分区表增加分区
只需要使用alter table table_name add partition语句即可。

当散列分区表增加分区后,Oracle会将数据重新分配,将一部分数据自动分配到新区中。

  • 为列表分区表增加分区
为列表分区表新增加一个分区,和创建列表分区表时一样需要为分区使用values子句指定取值列表。

alter table part_book3 add partition part3 values(default) tablespace mytemp3;--表示将清华大学出版社和北京大学出版社以外的所有图书记录添加到该分区中。

7)合并与删除分区

alter table range_book merge partitions part5,part6 into partition part1;

alter table range_book drop partition part1;


0 0
原创粉丝点击