2

我有一个包含以下列的父表:
- 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 必须包含分区键,例如 EVENT_DATE。
  2. 外键约束不能仅引用 PK 的一部分。因此子表必须同时包含 PARENT_ID 和 EVENT_DATE 列。

更重要的是,我还读到“使用引用分区时,大多数子表索引应该定义为全局索引,除非有令人信服的理由将给定索引定义为本地索引。” (http://www.nocoug.org/download/2010-05/Zitelli-Reference_Partitioning_NoCOUG.pdf)。

我是否遗漏了什么,或者没有全局索引或复制数据就无法使用参考分区?
非常感谢您解释参考分区如何与本地/全局索引一起使用!

4

2 回答 2

1

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

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

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

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

您说“在删除分区时使用全局索引进行 PK 会导致性能不合格”。当您从表中删除一个分区时,所有全局索引都将失效,您将不得不重建它们。这是有关 DDL 更改的唯一性能影响。分区表上的 PK 必须是全局的,因此您在这里别无选择。

于 2013-05-14T06:08:27.093 回答
0

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

如果您的属性已使用唯一约束定义,我相信 FK 可以引用 PK 的一部分,并且我在您的示例中看到这可能。

例子:

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

表 B(OrderID, ItemID)

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

我希望这有帮助。

于 2013-11-23T11:55:46.193 回答