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日常工作中很多操作都是围绕着分区表进行的。对关键数据表采用分区表技术,意味着很多的决策方案的制定。进行合理的分区规划方案,进行合理的未来预计,可以减少我们很多的维护工作。