Oracle 11g的新特性分区:System Partition

 

Partition分区是Oracle一直以来推出的性能、管理优化技术。在Oracle数据库技术体系中,Partition是归属在DWData Warehouse)体系中,也就是Oracle官方认定的处理大数据策略。

单就Partition技术本身而言,11g是一个重要的版本。一些自动化分区技术、增强策略在11g中推出。比如引用分区(Reference Partition)、间断分区(Interval Partition)、虚拟列分区(Partitioning Virtual Columns)、系统分区(System Partition)和拓展组合分区(Extended Composite Partitioning)。

本篇目的介绍11gSystem 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

 

 

2System Partition

 

我们在其他的Partition类型中,都会面对一个问题就是分区键选择。所谓分区Partition,就是将一个数据表段segment拆分为多个存储段保存。传统意义上的Partition停留在定义层面,只要我们在数据表定义的时候确定好分区键和分区策略。之后的使用数据表的过程中,我们其实对分区是“透明”的。

如果进行数据表的DML操作和select操作,我们是不需要指定、也无法控制数据记录插入到哪个分区中的。只有一种情况不同,就是修改分区键。如果修改分区键,并且修改分区键会影响到分区布局,这样的DML操作是不允许的。

11gSystem 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策略,设定了两个分区p1p2,并且指定了两个分区的表空间存储位置。

注意:这个过程中,我们没有指定分区规则,也就是没有告诉数据库当一个数据插入的时候,如何进行数据分堆。

检查数据字典,确定段结构情况。

 

 

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

 

 

3DML操作与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/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值