oracle自动分区maxvalue,对Maxvalue上限范围分区进行spilt操作

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

CORE10.2.0.1.0Production

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))

2partition by range(sal)

3(partition emp_p1 values less than (2000),

4partition emp_p2 values less than (4000),

5partition 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_VALUETABLESPACE_NAME NUM_ROWS

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

EMP_PAREMP_P12000SYSTEM8

EMP_PAREMP_P24000SYSTEM5

EMP_PAREMP_POMAXVALUESYSTEM3

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_NAMEPARTITION_NAME HIGH_VALUETABLESPACE_NAMENUM_ROWS

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

EMP_PAREMP_P12000SYSTEM8

EMP_PAREMP_P24000SYSTEM5

EMP_PAREMP_P36000SYSTEM

EMP_PAREMP_POMAXVALUESYSTEM3

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_NAMEPARTITION_NAMEHIGH_VALUETABLESPACE_NAME NUM_ROWS

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

EMP_PAREMP_P12000SYSTEM8

EMP_PAREMP_P24000SYSTEM5

EMP_PAREMP_P36000SYSTEM1

EMP_PAREMP_POMAXVALUESYSTEM2

Executed in 0.063 seconds

3、结论

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值