我有一个包含以下列的父表:
- 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)
为了对子表进行分区,我决定使用引用分区。它的一大优点是:它不需要复制子表中的分区键。但是,根据我的推理,实现这一目标的唯一方法是通过全局索引。这是我的思路:
更重要的是,我还读到“当使用引用分区时,大多数子表索引 应该被定义为全球性的,除非有令人信服的理由 将给定的索引定义为本地。“(http://www.nocoug.org/download/2010-05/Zitelli-Reference_Partitioning_NoCOUG.pdf)。
我是否遗漏了某些内容,或者在没有全局索引或重复数据的情况下是否无法使用引用分区? 关于参考分区如何与本地/全局索引一起工作的解释将非常受欢迎!
答案 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。
我希望这会有所帮助。