Oracle 11g参考分区和索引

时间:2013-05-14 00:20:59

标签: oracle oracle11g indexing

我有一个包含以下列的父表:
   - PARENT_ID:UUID
   - EVENT_DATE:TIMESTAMP
   - DATA_COLUMN1:VARCHAR2(255)
   - DATA_COLUMN2:VARCHAR2(255)

该表的范围由EVENT_DATE分区。数据仅保留一个月,最后一个分区每天都会丢弃。

根据我的理解,使用PK的全局索引会在删除分区时导致低于标准的性能。这意味着此表的PK必须基于PARENT_ID + EVENT_DATE才能创建本地索引。

我有第二张桌子是第一张桌子(通过一对多关系)。它有以下几列:
   - CHILD_ID:UUID
   - PARENT_ID:UUID - FK到父表中    - DATA_COLUMN3:VARCHAR2(255)
   - DATA_COLUMN4:VARCHAR2(255)

为了对子表进行分区,我决定使用引用分区。它的一大优点是:它不需要复制子表中的分区键。但是,根据我的推理,实现这一目标的唯一方法是通过全局索引。这是我的思路:

  1. 对于父表的唯一索引是本地的,PK必须包括分区键,例如活动日期。
  2. 外键约束不能仅引用PK的一部分。因此子表必须包含PARENT_ID和EVENT_DATE列。
  3. 更重要的是,我还读到“当使用引用分区时,大多数子表索引 应该被定义为全球性的,除非有令人信服的理由 将给定的索引定义为本地。“(http://www.nocoug.org/download/2010-05/Zitelli-Reference_Partitioning_NoCOUG.pdf)。

    我是否遗漏了某些内容,或者在没有全局索引或重复数据的情况下是否无法使用引用分区? 关于参考分区如何与本地/全局索引一起工作的解释将非常受欢迎!

2 个答案:

答案 0 :(得分:1)

你理解正确。如果要创建引用分区,则需要定义有效的FK。在您的情况下 - parent_id和event_id都需要出现在子表中。

引用分区适用于您希望根据PK中不在子表中的列而不是对表进行分区的情况。这不是你的情况 - 你可以在两个表上应用范围分区并获得最大修剪。

子表中的event_date不是多余的 - 模型需要它 - 对于 parent_id + event_date的每个实例,您需要子表中的data_columns 3/4。

关于ref分区表中子表的本地索引 - 我的逻辑恰恰相反。如果我有一个ref分区,我的目标是最大修剪,这意味着我希望在每个查询中尽可能少地访问分区。在这种情况下,我想要本地索引而不是全局索引。

你说“在删除分区时使用PK的全局索引会导致低于标准的性能”。当您从表中删除分区时,所有全局索引都将失效,您将不得不重建它们。这是DDL变化的唯一性能影响。分区表上的PK必须是全局的,因此您无法以任何方式进行选择。

答案 1 :(得分:0)

虽然上面的答案已得到回答,但你认为:'外键约束不能仅引用PK的一部分。因此子表必须包含PARENT_ID和EVENT_DATE列。'

我相信如果您的属性已使用Unique约束定义,FK可以引用PK的一部分。我在你的例子中看到了这一点。

示例:

表A(orderid,orderdate,custid) PF - > OrderID,OrderDate

表B(OrderID,ItemID)

在表B中,如果在表A中将OrderID定义为唯一,则orderID可以是FK。

我希望这会有所帮助。