聊聊分区Partition——我们为什么要分区(中)

 

上篇我们介绍了Oracle分区表在性能方面的优势,本篇集中在管理层面,讨论下管理层面的优势。

 

4、管理便捷性

 

相对于一个大数据对象(数据表、索引),分区化首先给我们带来的就是管理便捷。一个很大的数据表,无论是进行数据表重构,还是存储位置操作,都会面临连带负载问题。在生产环境下,这种负载变化尤其是我们希望避免的。

借助分区,我们可以将大对象划分为一系列小对象进行单独处理。也就是将一个突然性的大操作转变为一系列的小规模操作进行,从而减少对其他正在运行作业的影响。

下面是数据表T_PART,对应的本地索引。

 

 

SQL> select partition_name, tablespace_name from dba_segments where owner='SYS' and segment_name='T_PART';

 

PARTITION_NAME                 TABLESPACE_NAME

------------------------------ ------------------------------

P1                             SYSTEM

P2                             SYSTEM

P3                             SYSTEM

 

SQL> select partition_name, status from dba_ind_partitions where index_owner='SYS' and index_name='IDX_T_PART_IDP';

 

PARTITION_NAME                 STATUS

------------------------------ --------

P1                             USABLE

P2                             USABLE

P3                             USABLE

 

当我们需要调整一个数据表分区的表空间,到users表空间,我们可以使用单独的命令进行处理,而不会影响到其他数据。

 

 

SQL> alter table t_part move partition p1 tablespace users;

Table altered

 

SQL> select partition_name, tablespace_name from dba_segments where owner='SYS' and segment_name='T_PART';

 

PARTITION_NAME                 TABLESPACE_NAME

------------------------------ ------------------------------

P1                             USERS

P2                             SYSTEM

P3                             SYSTEM

 

针对分区索引,如果出现失效的情况,我们也是可以进行部分rebuild

 

 

SQL> select partition_name, status from dba_ind_partitions where index_owner='SYS' and index_name='IDX_T_PART_IDP';

 

PARTITION_NAME                 STATUS

------------------------------ --------

P1                             UNUSABLE

P2                             USABLE

P3                             USABLE

 

SQL> alter index idx_t_part_idp rebuild partition p1;

 

Index altered

 

SQL> select partition_name, status from dba_ind_partitions where index_owner='SYS' and index_name='IDX_T_PART_IDP';

 

PARTITION_NAME                 STATUS

------------------------------ --------

P1                             USABLE

P2                             USABLE

P3                             USABLE

 

此外,Oracle提供的很多针对分区的操作,比如导出特定分区数据、删除分区数据等,都是管理便捷性的体现。

 

5、数据删除

 

对大数据表,数据退出生命周期之后,就可以从数据表中进行删除。从数据活跃性理论角度看,任何数据在数据表中都是有生命周期的,一旦经过了业务处理高峰期,就应该会在某个特定标准框架下被删除。

大数据量删除是应用运维领域一个比较麻烦的事情。因为通常情况下,删除数据总数虽然很大,但是往往占到全部数据表比例不高。比如,每次Purge数据,可能都是数据表中最老的一周数据,而数据表中包括了近三个月数据。

一种结合设计的手段是将分区融入到过程中,将一次删除的数据放在相同的分区上,这样有两个好处。一个是可以将活性相同的数据放在相同位置上,避免低活性数据的影响。另一个是可以借助分区层次上的操作手段,快速进行数据删除操作。

 

SQL> select partition_name, tablespace_name from dba_segments where owner='SYS' and segment_name='T_PART';

 

PARTITION_NAME                 TABLESPACE_NAME

------------------------------ ------------------------------

P1                             USERS

P2                             SYSTEM

P3                             SYSTEM

 

SQL> set timing on;

SQL> alter table t_part drop partition p3;

 

Table altered

 

Executed in 0.453 seconds

 

SQL> select partition_name, tablespace_name from dba_segments where owner='SYS' and segment_name='T_PART';

 

PARTITION_NAME                 TABLESPACE_NAME

------------------------------ ------------------------------

P1                             USERS

P2                             SYSTEM

 

Executed in 0.015 seconds

 

注意:Drop Partition操作和普通的delete是有显著性区别的。Delete操作的核心在于“打标记”。Server Process检索所有符合条件的数据记录,标记为删除。这个过程的时间往往和数据量相关。

Drop Partition是一个DDL过程,这个过程中,数据并没有被删除,而是数据表的分区定义发生了变化,让Oracle“不再承认”分区的存在。这种方法删除数据和Truncate Table有相似之处。优点是速度快,适合大数据分区表的删除动作。

作为提醒注意一下,对于drop partition操作,Global IndexLocal Index的行为是有差异的,这一点和上面move操作的结果相同。如果是Local Index,其他分区的变化并不影响本分区的索引作用。所以,Local Index还是存在的。但是,Global Index由于结构上的特殊性,需要进行额外的rebuild操作。

当然,我们可以在drop partition的时候,连带加入update global indexes字句到drop partition命令中,实现自动的global索引重构。

 

 

SQL> create index idx_t_part_idg on t_part(object_name);

Index created

 

Executed in 0.983 seconds

 

SQL> alter table t_part drop partition p2 update global indexes;

Table altered

 

Executed in 0.609 seconds

 

SQL> select status from dba_indexes where owner='SYS' and index_name='IDX_T_PART_IDG';

STATUS

--------

VALID

 

Executed in 0.031 seconds

 

 

6、数据归档

 

归档Archive和删除是有一些差别的。删除表示的是数据不再需要,可以直接永久删除。实际生产环境中,直接删除的情况是比较少的,大部分情况是需要保留一个备份数据。只是将这个备份数据Offline出系统范围。

这个时候,使用分区数据表技术,可以快速的进行归档动作,卸载数据。先准备数据。

 

SQL> drop table t_part;

Table dropped

 

Executed in 1.03 seconds

 

SQL> create table t_part

  2  partition by list (owner)

  3  (

  4     partition p1 values('SYS'),

  5     partition p2 values('PUBLIC'),

  6     partition p3 values(default)

  7  )

  8  as

  9  select * from dba_objects;

 

Table created

 

Executed in 1.856 seconds

 

我们希望归档P2数据,可以先创建一个空数据表作为载体。

 

 

SQL> create table t_arch_p2 as select * from t_part where 1=0;

Table created

 

Executed in 0.094 seconds

 

 

SQL> alter table t_part exchange partition p2 with table t_arch_p2;

 

Table altered

 

Executed in 0.094 seconds

 

SQL> select count(*) from t_arch_p2;

 

  COUNT(*)

----------

     27703

 

Executed in 0.047 seconds

 

Exchange partition操作是一种非常强大的工具。语句基于操作定义层面的变化,将数据分区和数据表定义转换。所以,exchange partition操作的速度是非常有优势的。

将分区拆分出数据表t_part,到t_arch_p2独立数据表之后,我们接下来可以将其导出数据库或者备份到其他设备上。

下面我们继续看其他管理方面分区的用法。

 

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

转载于:http://blog.itpub.net/17203031/viewspace-1061914/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值