聊聊Oracle 11g中的Reference Partition(上)

 

Data Partition是Oracle早期提出的一项针对大数据对象的解决方案。经过若干版本的演变,Partition依然是目前比较流行、应用广泛并且接受程度较高的技术策略。

从Oracle产品线角度,Partition的成功是与Oracle不断丰富完善分区技术和方案是分不开的。在每一个版本中,Partition技术都推出一些新的进步和发展。无论是8、8i还是11g、12c,Partition技术都是在不断的向前进步,来满足更加复杂的实际应用需求。

本篇主要介绍11g新推出的Reference Partitioin。Reference Partition针对的业务场景是主外键关联。主表分区之后,借助Reference Partition可以实现自动的子表分区(不管子表上有无分区键)。经过Reference Partition分区之后,在同一个主表分区中的数据记录,对应到的子表记录,全部都在相同的子表分区上。

这种特性和分区类型,从性能和管理两个方面,都可以给日常运维带来很多好处方便。下面笔者将通过一系列实验来介绍Reference Partiton。

 

1、实验环境介绍

 

笔者选择Oracle 11g进行测试,具体版本为11.2.0.4。

 

 

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0 Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

 

 

2Reference Partition数据表创建

 

和普通主外键数据表创建没有过多差异,首先我们需要创建带分区的主表。

 

 

SQL> create table t_master

  2  ( object_id number,

  3    owner varchar2(100),

  4    object_name varchar2(100),

  5    object_type varchar2(100)

  6  )

  7  partition by list(owner) –List分区类型

  8  (

  9    partition p0 values ('PUBLIC'),

 10    partition p1 values ('SYS'),

 11    partition p3 values (default)

 12  )

 13  ;

 

--添加主键约束

SQL> alter table t_master add constraint pk_t_master primary key (object_id);

 

Table altered

 

 

创建子表,注意:Reference Partition并不要求子表中包括分区键,引用关系就是子表的分区依据。另外:使用Reference Partition要求创建子表和定义外键约束在同一个语句中。

 

 

SQL> create table t_detail

  2  ( object_id number,

  3    master_id number,

  4    obj_comment varchar2(100),

  5    obj_type varchar2(100),

  6    constraint fk_mas_det foreign key (master_id) references t_master(object_id)

  7  ) partition by reference(fk_mas_det);

 

create table t_detail

( object_id number,

  master_id number,

  obj_comment varchar2(100),

  obj_type varchar2(100),

  constraint fk_mas_det foreign key (master_id) references t_master(object_id)

) partition by reference(fk_mas_det)

 

ORA-14652: 不支持引用分区外键

 

 

我们收到了一个Oracle报错。首先我们看一下定义reference partition的语法,在create table语句中要创建定义好外键约束的名称。之后,利用partition by语句,将外键作为划分依据进行定义。

当前报错ORA-14652,检查一下官方对于这个错误的解释。

 

 

[oracle@localhost ~]$ oerr ora 14652

14652, 00000, "reference partitioning foreign key is not supported"

// *Cause:  The specified partitioning foreign key was not supported

//          for reference-partitioned tables. All columns of the

//          partitioning foreign key must be constrained NOT NULL with

//          enabled, validated, and not deferrable constraints. Furthermore,

//          a virtual column cannot be part of the partitioning foreign key.

//* Action: Correct the statement to specify a supported

//          partitioning foreign key.

 

 

说明中提示了错误原因,如果使用Reference Partition,外键列是不允许为空的。标准外键定义并没有规定外键列必须为空,但是如果使用引用分区技术,就必须要求外键列不能为空。

这种约束其实也好理解。Reference Partition不需要明确指定分区键,但是实际上还是需分区键(或者称为分区因素)。如果没有外键值,也就失去了到主表分区的定位功能,Oracle必然不会允许创建。修改建表语句如下:

 

 

SQL> create table t_detail

  2  ( object_id number,

  3    master_id number not null,

  4    obj_comment varchar2(100),

  5    obj_type varchar2(100),

  6    constraint fk_mas_det foreign key (master_id) references t_master(object_id)

  7  ) partition by reference(fk_mas_det);

 

Table created

 

 

下面从分区表角度观察两个数据表。

 

 

SQL> select partition_name, high_value, partition_position from dba_tab_partitions where table_owner='SYS' and table_name='T_MASTER';

 

PARTITION_NAME       HIGH_VALUE      PARTITION_POSITION

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

P0                   'PUBLIC'                         1

P1                   'SYS'                            2

P3                   default                          3

 

 

SQL> select partition_name, high_value, partition_position from dba_tab_partitions where table_owner='SYS' and table_name='T_DETAIL';

 

PARTITION_NAME       HIGH_VALUE      PARTITION_POSITION

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

P0                                                    1

P1                                                    2

P3                                                    3

 

 

注意两点:子表t_detailhigh_value列为空,说明该数据表并没有一个明确的分区键,主表分区键owner在子表中也不存在。另外,子表分区结构、数量和名称与主表完全相同。

从段结构segment上,我们可以看到11g的defered segment creation并没有应用。

 

 

SQL> select segment_name, partition_name, segment_type from dba_segments where owner='SYS' and segment_name in ('T_MASTER','T_DETAIL');

 

SEGMENT_NAME    PARTITION_NAME       SEGMENT_TYPE

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

T_MASTER        P3                   TABLE PARTITION

T_MASTER        P1                   TABLE PARTITION

T_MASTER        P0                   TABLE PARTITION

T_DETAIL        P3                   TABLE PARTITION

T_DETAIL        P1                   TABLE PARTITION

T_DETAIL        P0                   TABLE PARTITION

 

6 rows selected

 

 

3、数据插入实验

 

下面进行数据插入和分区分布实验。首先进行主表数据插入:

 

 

SQL> insert into t_master select object_id, owner, object_name, object_type from dba_objects;

120361 rows inserted

 

SQL> commit;

Commit complete

 

 

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

PL/SQL procedure successfully completed

 

 

子表数据插入:

 

 

SQL> insert into t_detail select seq_t_detail.nextval, object_id, object_name, object_type from dba_objects where object_name not in

('SEQ_T_DETAIL');

120361 rows inserted

 

SQL> commit;

Commit complete

 

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

PL/SQL procedure successfully completed

 

 

按照当前的数据关系,应该是一条主表记录,对应一条子表记录的关系。我们检查数据字典情况。

 

SQL> select table_name, partition_name, high_value,num_rows from dba_tab_partitions where table_owner='SYS' and table_name in ('T_MASTER');

 

TABLE_NAME        PARTITION_NAME       HIGH_VALUE        NUM_ROWS

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

T_MASTER          P0                   'PUBLIC'             33996

T_MASTER          P1                   'SYS'                37817

T_MASTER          P3                   default              48548

 

 

SQL> select table_name, partition_name, high_value,num_rows from dba_tab_partitions where table_owner='SYS' and table_name in ('T_DETAIL');

 

TABLE_NAME        PARTITION_NAME       HIGH_VALUE        NUM_ROWS

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

T_DETAIL           P0                                        33996

T_DETAIL           P1                                        37817

T_DETAIL           P3                                        48548

 

 

数据分布正确。说明:子表分区分布的依据完全在于主表记录对应的分区编号。相同主表分区记录对应的子表记录,一定在相同的子表分区上。不同主表分区记录对应的子表记录,不可能在相同的子表分区上。

为便于实验,多插入一些数据:

 

 

SQL> insert into t_detail select seq_t_detail.nextval, object_id, object_name, object_type from dba_objects where object_name not in

('SEQ_T_DETAIL');

120361 rows inserted

 

SQL> commit;

Commit complete

 

 

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

PL/SQL procedure successfully completed

 

SQL> select table_name, partition_name, high_value,num_rows from dba_tab_partitions where table_owner='SYS' and table_name in ('T_DETAIL');

 

TABLE_NAME     PARTITION_NAME       HIGH_VALUE        NUM_ROWS

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

T_DETAIL       P0                                        67992

T_DETAIL       P1                                        75634

T_DETAIL       P3                                        97096

 

 

那么,Reference Partition在实际运维场景下的意义在于何处呢?

经过笔者之前的讨论,Partition技术的出发点无非在于性能和管理两个角度。性能上最典型的代表是分区裁剪、本地索引;管理最典型代表就是分区摘除、Swip分区归档。最早期Partition是针对性能方面因素比较多,近年来随着硬件性能的提升,管理方面带来的优势,越来越受到重视。

下篇中,我们将从性能和管理两个角度,讨论Reference Partition的作用。

时间: 2024-07-28 17:37:11

聊聊Oracle 11g中的Reference Partition(上)的相关文章

聊聊Oracle 11g中的Reference Partition(下)

  上篇中,我们介绍了Reference Partition的创建.使用和原理.本篇将从性能和管理两个角度,讨论Reference Partition的作用.   4.Reference Partition与执行计划   直观上看,Reference Partition应当是有益于执行计划的.主子表之间通过外键进行关联,最常用的业务场景就是借助外键列进行关联查询.如果主表记录是在一个或者几个分区上,那么子表对应的记录应该是在一个或者几个分区上. 这样,就从定义层面减少了数据访问量.下面通过一系列

如何在oracle 11g 中导出空表

  如何在oracle 11g 中导出空表 由于oracle 11g的 延迟段创建的新特性,导致在没有数据插入时,oracle是不会分配数据段的,进而导致exp 是不能导出11g数据库的空表的. 当然采用expdp就不存在这个问题了. expdp hr/hr schemas=hr dumpfile=expdp.dmp directory=dbtest conn hr/hr select TABLE_NAME,NUM_ROWS from user_tables; TABLE_NAME NUM_RO

Oracle 11g中recyclebin参数的微小变化

SQL> show parameter recyclebin NAME      TYPE  VALUE ------------------------------------ ----------- ------------------------------ recyclebin      string  on SQL> alter system set recyclebin=off; alter system set recyclebin=off                    

盘点 Oracle 11g 中新特性带来的10大性能影响

盘点 Oracle 11g 中新特性带来的10大性能影响 原创 2017-08-02 盖国强 数据和云 Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之初,首先引起的是一些麻烦,因为对于新技术的不了解.因为对于旧环境的不适应,从Oracle产品到技术服务运维,总是要走过一个磨合的长期过程. 请注意:我们并不推荐大家盲目的关闭和摒弃Oracle的新特性,我们建议大家在遇到问题时,做出适合自己的调整. 就此盘点一下 Oracle 11g 中,那些新特性带来的新

【Oracle】Oracle 11g 中的自动数据库维护任务管理

对于11g版本的oracle 有三个自动维护定时任务. 1 自动优化器统计收集:为所有方案对象收集陈旧的或缺少的统计数据,所收集的统计信息将被用来提高sql的执行的性能,任务名是"auto optimizer stats collection" 2 自动分段顾问:标识数据库中的段是否有可以回收的空间,并以此信息统计为基础做出怎样整理段的碎片以节约空间.你也可以手动的执行此job来获取最新的建议信息,或者获取自动段advisor 不检测的但又可以回收的段的信息,任务名是"aut

Oracle 11g中CTE的应用示例

关于SQL SERVER中的CTE中的CTE应用,请看这里:http://www.cnblogs.com/downmoon/archive/2009/10/23/1588405.html 其实,ORACLE的CTE语法完全一样,看示例: 一.创建示例数据表如下: declare tableExistedCount number; begin select count(1) into tableExistedCount from user_tables where TABLE_NAME ='Dem

如何解决oracle 11g中的ORA-00845错误

oracle11g数据库,修改了内存参数memory_max_target=943718400,关闭数据库重新启动的时候报错 [oracle@instuctor shm]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Mon Nov 19 09:34:11 2012 Copyright (c) 1982, 2011, Oracle.  All rights reserved. Connected to an idl

Oracle 11g中密码过期问题详解_oracle

密码过期的原因一般有两种可能: 一.由于Oracle中默认在default概要文件中设置了"PASSWORD_LIFE_TIME=180天"所导致. 二.由于Oracle中默认在default概要文件中设置了"FAILED_LOGIN_ATTEMPTS=10次",当输入密码错误次数达到设置值将导致此问题. 第一种情况解决方法如下: 1.查看用户用的哪种profile策略,一般是default: 复制代码 代码如下: SQL> select username,p

Oracle 11g的新特性

Oracle 11g于2007年7月11日美国东部时间11时(北京时间11日22时)正式发布,11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Information Lifecycle Management)等多项创新. 一.新特性提纲 1.数据库管理部分 ◆数据库重演(Database Replay) 这一特性可以捕捉整个数据的负载,并且传递到一个从备份或者standby数据库中创建的测试数据库上,然后重演负责以测试系统调优后的效果. ◆SQL重演(S