对Maxvalue上限范围分区进行spilt操作

来源:互联网 发布:国信软件 编辑:程序博客网 时间:2024/04/27 22:03

Oracle分区表是对关键数据表,特别是海量数据表的一种普适性很好的技术方案。借助分区表,通常都可以有效的提升数据表访问性能,增强系统可管理能力。对分区表设计通常具有三个方面的决策点,分别为分区类型分区键、建表分区规划和分区存储规划。

 

ü        分区类型分区键:数据表使用什么分区键和分区类型进行分区。这个通常是分区表设计中最重要的环节。目前,Oracle支持范围Range、列表List、哈希Hash等分区类型。不同类型的分区还可以实现组合Composite分区。分区键的选取方式很多,大都是对数据列或者列的处理值进行。选择分区类型、分区键的准则有两个:易于管理和均衡化访问。易于管理的含义就是让系统中分区的数据不宜过多,过多的分区只能带来管理上的困难。均衡化访问就是尽可能实现将数据访问集中在分区内部,尽可能避免出现跨分区类型操作;

ü        建表分区规划:在开发和测试环境下,我们可以比较随意的进行数据表分区的增加修改和删除。但是对真正的海量数据,特别是生产环境下的海量数据,要提前规划出预想分区。比如,对于一个按自然月分区的数据表,最好事先规划出提前两到三年的数据分区。如果分区设置过小或者缺少,那么在生产环境下进行表重构的压力是比较大的;

ü        分区存储规划:同一般数据表的不同,分区表是多个段segment组成的。这样,数据表就可以贮存在不同tablespaces中的可能,更进一步可以分布在不同的数据文件和磁盘上。分区表是否要使用多tablespace保存以分散IO,要进行统一严谨的规划;

 

范围分区(Range Partition)是我们经常使用分区类型。Range Partition将数据依据数据列范围上下限设置为不同的分区。最后的MaxValue关键字,可以保证数据一定会落入分区。问题来了,如果我们没有预先规划好分区,就可能出现多个数据分区集中的情况。

 

比如:我们使用日期进行分区,2010年每个月都划分了分区,大于2010年12月的月份都用Maxvalue进行收底。但是到了2011年,发现系统仍在运行,2011年数据全部集中到了最后分区。这种情况如何处理呢?本篇使用spilt partition语句进行类型情况的处理演示。

 

1、 数据环境准备

 

我们使用Oracle 10gR2环境进行试验。

 

 

SQL> select * from v$version;

 

BANNER

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

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0    Production

 

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 Production

 

 

数据表emp_par设置为分区表,使用sal列进行范围分区。数据表采用2000和4000两个范围。最后使用Maxvalue进行过大值容纳。

 

 

SQL> create table emp_par (sal number(7,2))

  2  partition by range(sal)

  3  (partition emp_p1 values less than (2000),

  4   partition emp_p2 values less than (4000),

  5   partition emp_po values less than (MAXVALUE));

 

Table created

 

Executed in 0.031 seconds

 

//插入了一些数据;

 

SQL> select table_name, partition_name, high_value, tablespace_name, num_rows from dba_tab_partitions where table_name='EMP_PAR';

 

TABLE_NAME PARTITION_NAME HIGH_VALUE      TABLESPACE_NAME NUM_ROWS

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

EMP_PAR    EMP_P1         2000            SYSTEM                8

EMP_PAR    EMP_P2         4000            SYSTEM                5

EMP_PAR    EMP_PO         MAXVALUE        SYSTEM                3

 

Executed in 0.078 seconds

 

 

三个分区中,均包括了一些数据,其中的emp_po分区中包括数据如下。

 

 

SQL> select * from emp_par where sal>4000;

 

      SAL

---------

  5000.00

  6000.00

  8000.00

 

Executed in 0.047 seconds

 

 

 

2、Spilt分区操作

 

需求:将emp_po分区进行再次划分,将4000到6000的数据作为一个新的分区出现。emp_po之后就包括6000以上的数据。

 

实现这个分区操作,可以按照如下步骤完成:

 

ü        建立数据表,保存新分区数据

 

建立一个数据表,使用新的分区条件将数据保存出来。之后,将原有数据表中相应记录剔除掉。

 

 

SQL> create table emp_temp as select * from emp_par where sal>=4000 and sal<6000;

Table created

 

Executed in 0.078 seconds

 

SQL> delete emp_par where sal>=4000 and sal<6000;

1 row deleted

 

Executed in 0 seconds

 

 

ü        使用spilt partition划分目标分区

 

使用alter table xxx spilt partition进行分区。

 

 

SQL> alter table emp_par split partition EMP_PO at(6000) into (partition EMP_P3, partition EMP_PO);

 

Table altered

 

Executed in 0.031 seconds

 

 

从emp_po的基础上,划分出新的分区emp_p3和emp_po。分区标准点在6000的位置上。

 

ü        使用exchange partition进行分区替换

 

下面,要使用exchange partition进行分区数据表替换。将数据表emp_temp替换为emp_p3分区。

 

 

SQL> alter table emp_par exchange partition EMP_P3 with table emp_temp;

 

Table altered

 

Executed in 0.046 seconds

 

 

在之前笔者的文章中,已经探讨过exchange partition的本质(http://space.itpub.net/17203031/viewspace-704826)。exchange partition不是进行数据复制,而是进行元数据替换。将两个段segment对象元数据进行交换。所以相对于复制,exchange partition操作更高效些。

 

此时,我们查看数据信息。

 

 

SQL> select table_name, partition_name, high_value, tablespace_name, num_rows from dba_tab_partitions where table_name='EMP_PAR';

 

TABLE_NAME  PARTITION_NAME HIGH_VALUE      TABLESPACE_NAME    NUM_ROWS

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

EMP_PAR     EMP_P1         2000            SYSTEM             8

EMP_PAR     EMP_P2         4000            SYSTEM             5

EMP_PAR     EMP_P3         6000            SYSTEM             

EMP_PAR     EMP_PO         MAXVALUE        SYSTEM             3

 

Executed in 0.078 seconds

 

SQL> exec dbms_stats.gather_table_stats(user,'EMP_PAR',cascade => true);

 

PL/SQL procedure successfully completed

 

 

SQL> select table_name, partition_name, high_value, tablespace_name, num_rows from dba_tab_partitions where table_name='EMP_PAR';

 

TABLE_NAME  PARTITION_NAME       HIGH_VALUE      TABLESPACE_NAME NUM_ROWS

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

EMP_PAR     EMP_P1               2000            SYSTEM          8

EMP_PAR     EMP_P2               4000            SYSTEM          5

EMP_PAR     EMP_P3               6000            SYSTEM          1

EMP_PAR     EMP_PO               MAXVALUE        SYSTEM          2

 

Executed in 0.063 seconds

 

 

 

 

3、 结论

 

分区表是一种需要我们倾注很多研究精力和管理精力的对象。运维DBA日常工作中很多操作都是围绕着分区表进行的。对关键数据表采用分区表技术,意味着很多的决策方案的制定。进行合理的分区规划方案,进行合理的未来预计,可以减少我们很多的维护工作。

原创粉丝点击