Partition分区是Oracle一直以来推出的性能、管理优化技术。在Oracle数据库技术体系中,Partition是归属在DW(Data Warehouse)体系中,也就是Oracle官方认定的处理大数据策略。
单就Partition技术本身而言,11g是一个重要的版本。一些自动化分区技术、增强策略在11g中推出。比如引用分区(Reference Partition)、间断分区(Interval Partition)、虚拟列分区(Partitioning Virtual Columns)、系统分区(System Partition)和拓展组合分区(Extended Composite Partitioning)。
本篇目的介绍11g的System Partition特性。
1、环境介绍
笔者选择Oracle 11R2作为实验对象。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 – Production
2、System Partition
我们在其他的Partition类型中,都会面对一个问题就是分区键选择。所谓分区Partition,就是将一个数据表段segment拆分为多个存储段保存。传统意义上的Partition停留在定义层面,只要我们在数据表定义的时候确定好分区键和分区策略。之后的使用数据表的过程中,我们其实对分区是“透明”的。
如果进行数据表的DML操作和select操作,我们是不需要指定、也无法控制数据记录插入到哪个分区中的。只有一种情况不同,就是修改分区键。如果修改分区键,并且修改分区键会影响到分区布局,这样的DML操作是不允许的。
11g的System Partition提供了不同选择。它提供给SQL DML操作者一种选择,让可以指定出“希望将数据保存”在哪个地方。
创建System Partition的过程,也是在定义数据表的过程中需要确定。
SQL> create table t partition by system (partition p1 tablespace users,
2 partition p2 tablespace EXAMPLE) as select * from dba_objects where 1=0 ;
create table t partition by system (partition p1 tablespace users,
partition p2 tablespace EXAMPLE) as select * from dba_objects where 1=0
ORA-14704: 不允许对 SYSTEM 分区表执行以下操作: Create table as select
在system partition中,我们不允许对分区进行spilt操作和cats操作。正确的处理方式,如下:
SQL> create table t
2 (owner varchar2(100),
3 object_name varchar2(1000),
4 object_id number)
5 partition by system
6 (partition p1 tablespace users,
7 partition p2 tablespace example);
Table created
在语句中,我们指定了数据表采用分区策略——system策略,设定了两个分区p1和p2,并且指定了两个分区的表空间存储位置。
注意:这个过程中,我们没有指定分区规则,也就是没有告诉数据库当一个数据插入的时候,如何进行数据分堆。
检查数据字典,确定段结构情况。
SQL> select segment_name, partition_name, segment_type from dba_segments where owner='SCOTT' and segment_name='T';
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
-------------------- -------------------- ------------------
T P1 TABLE PARTITION
T P2 TABLE PARTITION
SQL> select partitioning_type from dba_part_tables where owner='SCOTT' and table_name='T';
PARTITIONING_TYPE
-----------------
SYSTEM
分区类型,确定为system partition。在system partiton中,也可以创建local index对象。
SQL> create index idx_t_id on t(object_id) local;
Index created
SQL> select segment_name, partition_name, segment_type from dba_segments where owner='SCOTT' and segment_name='IDX_T_ID';
SEGMENT_NAME PARTITION_NAME SEGMENT_TYPE
-------------------- -------------------- ------------------
IDX_T_ID P1 INDEX PARTITION
IDX_T_ID P2 INDEX PARTITION
3、DML操作与System Partition
下面是DML操作,普通Partition在定义数据表的时候,就已经确定数据“分堆”的规则,所以进行数据操作的时候,操作SQL和普通数据表没有差别。但是,system partition没有在定义阶段确定好规则,所以SQL就必然要制定处理原则。
SQL> insert into t select owner ,object_name, object_id from t;
insert into t select owner ,object_name, object_id from t
ORA-14701: 对于按“系统”方法进行分区的表, 必须对 DML 使用分区扩展名或绑定变量
我们需要在插入数据表的时候,明确的指定数据插入的位置分区。
SQL> insert into t partition(p1) select owner, object_name, object_id from dba_objects where owner in ('SYS','PUBLIC');
58673 rows inserted
SQL> insert into t partition(p2) select owner, object_name, object_id from dba_objects where owner not in ('SYS','PUBLIC');
14130 rows inserted
SQL> commit;
Commit complete
之后,可以看到明显的分区体积变化。
SQL> select segment_name, partition_name, bytes from dba_segments where owner='SCOTT' and segment_name='IDX_T_ID';
SEGMENT_NAME PARTITION_NAME BYTES
-------------------- -------------------- ----------
IDX_T_ID P1 2097152
IDX_T_ID P2 524288
我们在普通的partition中,如果一个数据表的update操作,涉及到分区键,并且分区键的修改会引起数据记录分区所属位置问题,Oracle是拒绝进行操作的。
创建一个对比试验数据表t_normal。
SQL> create table t_normal
2 (owner varchar2(100),
3 object_name varchar2(100),
4 object_id number)
5 partition by list (owner)
6 (partition p1 values ('SYS'),
7 partition p2 values (default));
Table created
SQL> insert into t_normal select owner, object_name, object_id from dba_objects;
72806 rows inserted
SQL> commit;
Commit complete
如果修改owner,引起分区所属关系变化,Oracle是拒绝的。
SQL> update t_normal set owner='SYS' where owner='SCOTT';
update t_normal set owner='SYS' where owner='SCOTT'
ORA-14402: 更新分区关键字列将导致分区的更改
这其实就是我们选择分区键时候,一定要选择一个“不变化”的数据取值原因。
但是这个原则对于system partition而言,就不成立了。因为数据放在哪个分区里面,完全是用户insert过程中输入确定的,所以这种约束不存在。
SQL> update t set owner='SYS' where OWNER='SCOTT';
26 rows updated
SQL> commit;
Commit complete
4、结论
最后,笔者想聊聊这个特性的用法。在准备这个知识点的时候,笔者一直在思考这个分区类型的使用场景。我们使用分区的两个出发点,就是性能优势和管理优势。System Partition的最大好处是在于自由,我们可以通过SQL语句控制一条记录究竟放在哪个分区里面。
个人感觉,这个特性对于管理上的优势可能比较大。比如,在应用中,我们可以控制数据插入到哪个分区中,如果是OLTP系统,就是将负载集中在某个分区上。其他分区就可以进行日常的运维工作。
那么,这个特点在没有System Partition的时候,也是可以实现,就是通过额外的数据列中定义存储位置。这种方法的缺点是技术部署细节传导入业务模型层面。而System Partition就是实现了这个功能。
11g带给我们很多分区特性,就笔者所知,这些特性在实际场景下使用的并不广泛。相信随着12c推出,11g大量部署,这些特性会更加广泛使用。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-777449/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-777449/