暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库分区技术之“引用分区”详解及操作过程

Oracle微学堂 2018-01-31
1085

01

理论知识

概念:

根据Oracle官方文档介绍,引用分区表是通过PARTITION BY REFERENCE语句来实现,需要指定引用约束的名称,该约束将成为应用到该引用分区表所使用的约束。这个约束必须启用和执行。
和其他分区表一样,你可以制定对象级别的默认属性,也可以随意在特定分区设置属性,覆盖对象级别的属性。

解决的问题:

如果父表是分区表,子表想要按照父表的方式进行分区。

父表中被引用的主键列不一定要是分区键。

注意事项:

1.     引用分区子表没有指定分区描述,默认和父表保持一致

2.     如果要指定分区描述,则分区描述的个数必须和父表的分区数保持一致。

3.     如果父表是一个复合分区表,则子表的分区和父表的子分区一一对应;否则,子表分区和父表的分区一一对应。

4.     在引用分区表中不能指定分区的边界。

5.     引用分区表的分区可以单独命名,如果没有显式地制定分区名称,则直接继承其关联的父表分区名称,除非父表分区名称和已有名称冲突。这种情况下,系统将自动生成一个分区名称。


02

课堂实验

下面是设计分区方案过程中的一个典型问题,并非所有表都需要根据其进行分区的列。假设要创建一个销


售系统,该系统包括两个简单的表(sales customers)。


customers 表的创建如下所示:


create table customers  

(  

   cust_id   number primary key,  

   cust_name varchar2(200),  

   rating    varchar2(1) not null  

)  

partition by list (rating)  

(  

   partition pA values ('A'),  

   partition pB values ('B')  

);  


sales表的创建如下所示。它是customers表的一个子表。


create table sales  

(  

   sales_id    number primary key,  

   cust_id     number not null,  

   sales_amt   number,  

   constraint  fk_sales_01  

    foreign key (cust_id)  

    references customers  

);  


在理想情况下,希望用相同的方式对sales表和customers表进行分区,根据rating列进行列表分区。


但有一个严重的问题,sales表没有名为rating的列,那么如何根据一个不存在的列进行分区呢?


Oracle 11g中,可以使用一个称为引用分区的新特性。下面的示例显示了如何将该特性应用于sales


表:


create table sales  

(  

   sales_id    number primary key,  

   cust_id     number not null,  

   sales_amt   number,  

   constraint  fk_sales_01  

    foreign key (cust_id)  

    references customers  

)  

partition by reference (fk_sales_01);  


这段代码创建了与父表customers中相同的分区。注意,虽然没有名为rating的列,但仍根据该列对表


进行了分区。partition by reference (fk_sales_01)子句包括了分区定义中的外键名。该语句指


Oracle 11g确认通过父表(在该示例中为 customers)中使用的方案进行了分区。注意cust_id


NOT NULL约束,这是引用分区所必需的。


检查 sales 表中分区的分区边界:


SQL> select partition_name, high_value  

   from user_tab_partitions  

   where table_name = 'SALES';  


PARTITION_NAME  HIGH_VALUE  

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

PA  

PB  


HIGH_VALUE为空,这意味着此处的边界派生自父表。分区的名称与父表中的名称相同。可以通过查询


user_part_tables视图来检查分区的类型。一个名为ref_ptn_constraint_name的特殊列显示了外


键约束名称。


SQL> select table_name, partitioning_type, ref_ptn_constraint_name  

    from user_part_tables  

    where table_name in ('CUSTOMERS','SALES');  


TABLE_NAME                     PARTITION REF_PTN_CONSTRAINT_NAME  

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

CUSTOMERS                      LIST  

SALES         


如果希望按照父表分区的方式对子表进行分区,但没有相同的列,又不仅为了分区而引入这些列,此时引


用分区将非常方便。而且,不必针对每个子表显式声明一个很长的分区子句。


扫描二维码关注我的微学堂

搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!



文章转载自Oracle微学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论