ITPub博客

首页 > 数据库 > Oracle > 分区表和dbms_redefinition包在线重定义表

分区表和dbms_redefinition包在线重定义表

原创 Oracle 作者:dotaddjj 时间:2011-10-17 23:13:35 0 删除 编辑

分区表很早就接触的一项技术手段。分区表虽然在逻辑上是同一张表,可是在数据库底层的segment确实多个对象,管理和维护可以只对分区表进行维护,采取将分区表存储在不同的表空间,表空间存储在不同的磁盘,改善了对表段的I/O。

虽然自己所接触的生产库中并不存在分区表,但是一般超过了2Gb的表段就最好使用分区表,而且一些需要定期删除历史数据的表也可以采取分区表技术。

range范围分区

create table t10_partition(id number,edate date)

partition by range(edate)

(

partition p1 values less than(to_date('2011-10-1','yyyy-mm-dd')) tablespace users,

partition p2 values less than(('2011-10-1','yyyy-mm-dd')) tablespace test

)

range分区中的maxvalue也包括null,当insert into t10_partition values(null,null),数据还是会存在p2分区中。

list分区:

create table t12_partition(id number,edate date)

partition by list(id)

(

partition p1 values(1) tablespace users,

partition p2 values(2) tablespace test

)

按列表的值来分区

hash分区:

create table t13_partition(id number,edate date)

partition by hash(id)

(

partition p1 tablespace users,

partition p2 tablespace users

)

hash分区采取的对列值进行hash算法,确定放入哪个分区。当列的值没有合适的选择条件时,采取hash分区,hash分区均匀分布数据。一般hash分区的数量为2的n次方,可以使得分区间数据更加均匀。

复合范围hash分区:

create table t14_partition(id number,edate date)

partition by range(id) subpartition by hash(edate)

(

partition p1 values less than(20) tablespace users,

partition p2 values less than(50) tablespace users

)

几个有关分区的命令:

添加分区

alter table t10_partition add partition p3 values less than(maxvalue)

add partition需要高于最后一个分区

删除分区

alter table t10_partition drop partition p3

截断分区

Alter table t10_partition truncate partition p3

合并分区

Alter table t10_partition merge partitions p1,p2 into partition p2

合并分区需要将分区合并到较高的分区

Alter table t10_partition rename partition p2 to p1

其实说到分区表,oracle 9I后推出了在线重定义表的功能来对表段进行在线重定义,其中利用系统包可以把普通表修改为分区表,而且在修改过程中也可以进行正常的dml。

Create table t(id number,name varchar2(20))

Insert into t as select rownum,table_name from user_tables

Commit

此时t表中有部分数据信息,如果考虑到后续的t表数据量信息较大和I/O需要把t表进行分区可以利用oracle的基本语法:

Create table t01

Partition by hash(name)

(

Partition p1 tablespace users,

Partition p2 tablespace test

)

利用oracle的基本语法:

Insert table t01 select * from t

Alter table t rename tt

Alter table t01 rename to t

不过此时可能insert过程中还会有数据信息,所以对于7*24生产环境而且数据交换又比较大,此时就极有可能漏掉数据信息

还需要我们再一次检查。

利用dbms_redefinition包来在线重定义表

Execute dbms_redefinition.can_redef_table(‘ashuang’,’t’)

需要对t表定义主键,也可以使用rowid来在线重定义,不过一般不推荐

因为会产生一个虚列,不然无法对表进行在线重定义

Execute dbms_redefinition.start_redef_table(‘ashuang’,’t’,’t10_partition’)

Execute dbms_redefinition.sync_interim_table(‘ashuang’,’t’,’t10_partition’)

此时如果对t表进行dml,t10_partition也会同步t表的dml

Execute

Dbms_redefinition.finish_redef_table(‘ashuang’,’t’,’t10_partition’)

个人测试也是如此

session A在finish_redef_table时t表会被独占锁,如果此时别的session B还有未提交的dml,此时会在session A 执行finish_redef_table时出现等待直到别的session B的事务提交过程才会执行完毕。

其实把分区表在线重定义为普通表可以的。自己可以测试下还可以对列增加 删除 索引组织表修改等。

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1055754/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    220
  • 访问量
    1662988