Oracle分区表3种重建方法(基础原理、优点、类型、表分区总结)----(实战)

一.分区原理

提供了分区技术以⽀持VLDB(Very Large DataBase),分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中,分区完全对应透明。

Oracle的分区表可以包括多个分区,每个分区都是⼀个独的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的法来进查询。 

二.分区提供以下优点:

1.由于将数据分散到各个分区中,减少了数据损坏的可能性;

2.可以对单独的分区进行备份和恢复;

3.可以将分区映射到不同的物理磁盘上,来分散IO;

4.提⾼可管理性、可用性和性能。

三.几种分区类型:

范围分区(range);

哈希分区(hash);

列表分区(list);

范围-哈希复合分区(range-hash);

范围-列表复合分区(range-list)。

四.重建分区表

Oracle的普通表没有办法通过修改属性的式直接转化为分区表,必须通过重建的式进转变

介绍三种效率,并说明它们各的特点。

法⼀:利原表重建分区表。

步骤:

SQL> create table regular_rebuild_tab (id number primary key, time date);

表已创建。

SQL> insert into regular_rebuild_tab select rownum, created from dba_objects; 

已插入数据。

SQL> commit; 

提交完成。

 

SQL> create table t_new (id, time) partition by range (time)

 (partition p1 values less than (to_date('2004-7-1', 'yyyy-mm-dd')),

 partition p2 values less than (to_date('2005-1-1', 'yyyy-mm-dd')),

 partition p3 values less than (to_date('2005-7-1', 'yyyy-mm-dd')),

 partition p4 values less than (maxvalue))

 as select id, time from regular_rebuild_tab;

 

SQL> rename regular_rebuild_tab to t_regular_old;  

表已重命名。

SQL> rename t_new to regular_rebuild_tab;  

表已重命名。

 

SQL> select count(*) from regular_rebuild_tab; 

SQL> select count(*) from regular_rebuild_tab partition (p1);

SQL> select count(*) from regular_rebuild_tab partition (p2);

SQL> select count(*) from regular_rebuild_tab partition (p3);

 

优点:方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较⾼,而且建表完成后数据已经在分布到各个分区中了。

不足对于数据的⼀致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定regular_rebuild_tab表的方式保证⼀致性,在执行CREATE TABLE 语句和RENAME T_NEW TO regular_rebuild_tab语句直接的修改可能会丢失,如果要保证⼀致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。

另外在执行两个RENAME语句之间执行的对T的访问会失败。

于修改不频繁的表,在闲时进操作,表的数据量不宜太

法⼆:使交换分区的法。

建表

sql> create table swap_tab (id number primary key, time date);

表已创建。

sql> insert into swap_tab select rownum, created from dba_objects;

插入数据。

sql> commit;

 

sql> create table t_new (id number primary key, time date) partition by range (time)

(partition p1 values less than (to_date('2005-7-1', 'yyyy-mm-dd')),

partition p2 values less than (maxvalue));

 

表已创建。

sql> alter table t_new exchange partition p2 with table swap_tab;

表已更改。

 

sql> rename swap_tab to t_swap_old; 

表已重命名。

sql> rename t_new to swap_tab;

表已重命名。

sql> select count(*) from swap_tab;

 

优点:只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最⾼。如果对数据在分区加中的分布没有进⼀步要求的话,实现比较较简单。在执行完RENAME操作后,可以检查t_swap_old中是否存在数据,如果存在的话,直接将这些数据插入到swap_tab中,可以保证对swap_tab插入的操作不会丢失。

仍然存在⼀致性问题,交换分区之后rename t_new to swap_tab之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。

于包含量的表转到分区表中的⼀个分区的操作。应尽量在闲时进操作。 

法三:Oracle9i以上版本,在线重定义功能步骤: 

sql> create table redefine_online_tab (id number primary key, time date);

表已创建。

sql> insert into redefine_online_tab select rownum, created from dba_objects;

已创建6264行。

sql> commit;

提交完成。

 

sql> exec dbms_redefinition.can_redef_table(user, 'redefine_online_tab', dbms_redefinition.cons_use_pk);

 

pl/sql 检查表是否可以在线重定义过程已成功完成。

sql> create table t_new (id number primary key, time date) partition by range (time)

 (partition p1 values less than (to_date('2004-7-1', 'yyyy-mm-dd')),

 partition p2 values less than (to_date('2005-1-1', 'yyyy-mm-dd')),

 partition p3 values less than (to_date('2005-7-1', 'yyyy-mm-dd')),

 partition p4 values less than (maxvalue));

表已创建。

 

sql> exec dbms_redefinition.start_redef_table(user, 'redefine_online_tab', 't_new',  'id id, time time', dbms_redefinition.cons_use_pk);

 

pl/sql 创建在线重定义过程已成功完成。

sql> exec dbms_redefinition.finish_redef_table('yangqingbo', 'redefine_online_tab', 't_new');

 

pl/sql 结束重定义过程已成功完成。

sql> select count(*) from redefine_online_tab;

sql> select count(*) from redefine_online_tab partition (p2);  

sql> select count(*) from redefine_online_tab partition (p3); 

SQL>select count(*) from t_new;

 

优点:保证数据的⼀致性,在⼤部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

实现上比上面两种略显复杂。

于各种情况。

五.分区问题总结:

1.索引也可以进分区,分区索引有两种类型:global和local。

对于local索引,每⼀个表分区对应⼀个索引分区,当表的分区发生变化时,索引的维护由Oracle⾃动进行。

对于global索引,可以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维护操作时,通常会导致全局索引的INVALDED,必须在执行完操作后REBUILD。

Oracle9i提供了UPDATE GLOBAL INDEXES 语句,可以使在进行分区维护的同时重建全局索引。

2.全局索引可以包含多个分区的值局部索引全局索引容易管理,全局索引较快

注意:不能为散列分区或者分区创建全局索引

3.分区功能分强大,不过起来发现有点不大方便:

第一点是如果采用了local分区索引,那么在增加表分区的时候,索引分区的表空间是不可控制的。

第二点如果希望将表和索引的分区分开到不同的表空间且不同索引分区也分散到不同的表空间中,那么只能在增加分区后,对新增的分区索引单独rebuild。

4.Oracle最允许存在多少个分区呢?

可以从Oracle的上找到这个信息,对于Oracle9iR2:

Tables can be partitioned into up to 64,000 separate partitions.

表最多可以划分为64,000个单独的分区。

5.对于Oracle10gR2,Oracle增强了分区特性:

Tables can be partitioned into up to 1024K-1 separate partitions.

表最多可以划分为1024K-1个单独的分区。

6.关于何时应该进分区,Oracle有如下建议:

■ Tables greater than 2GB should always be considered for partitioning.

■ Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.

大于2GB的表应该被考虑分区。

包含历史数据的表,其中新数据被添加到最新的分区中。一个典型的例子是一个历史表,其中只有当前月份的数据是可更新的,其他11个月是只读的。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Running Sun丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值