首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle 11g引用分区和索引

Oracle 11g引用分区和索引
EN

Stack Overflow用户
提问于 2013-05-14 00:20:58
回答 2查看 2.3K关注 0票数 2

我有一个包含以下列的父表:

  • PARENT_ID: UUID
  • EVENT_DATE:时间戳
  • DATA_COLUMN1: VARCHAR2(255)
  • DATA_COLUMN2: VARCHAR2(255)

表是由EVENT_DATE分区的。数据只保留一个月,最后一个分区每天被删除。

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

我有第二个桌子,这是第一个孩子(通过一对多的关系)。它有以下各栏:

  • CHILD_ID: UUID
  • PARENT_ID: UUID到父表
  • DATA_COLUMN3: VARCHAR2(255)
  • DATA_COLUMN4: VARCHAR2(255)

要对子表进行分区,我决定使用引用分区。它的一个大优点是:它消除了复制子表中的分区键的需要。然而,根据我的推理,实现这一目标的唯一途径是通过全局索引。这是我的思路:

  1. 为了使父表的唯一索引是本地的,PK必须包括分区键,例如EVENT_DATE。
  2. 外键约束不能仅引用PK的一部分。因此,子表必须同时包含PARENT_ID列和EVENT_DATE列。

此外,我还读到“当使用引用分区时,大多数子表索引应该定义为全局索引,除非有令人信服的理由将给定的索引定义为本地索引。”(NoCOUG.pdf)。

我是遗漏了什么,还是没有办法在没有全局索引或复制数据的情况下使用引用分区?

我们将非常感谢对引用分区如何与本地/全局索引工作的解释!

EN

回答 2

Stack Overflow用户

发布于 2013-05-14 06:08:27

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

Ref分区用于根据一个列(而不是PK中的列)对表进行分区,而不是在子表中。这不是您的情况-您可以在两个表上应用范围分区并获得最大的剪枝。

子表中的event_date并不是多余的--它是模型所需要的--您需要为parent_id + event_date的每个实例在子表中使用data_columns 3/4。

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

您说过,“在PK中使用全局索引将导致删除分区时的性能不合格”。当您从表中删除一个分区时,所有全局索引都将失效,您必须重新构建它们。这是对DDL更改的唯一性能影响。分区表上的PK必须是全局的,所以您在这里没有选择。

票数 1
EN

Stack Overflow用户

发布于 2013-11-23 11:55:46

虽然上面的答案已经回答了,但您认为:“外键约束不能只引用PK的一部分,因此子表必须同时包含PARENT_ID和EVENT_DATE列。”

我相信,如果您的属性是用唯一约束定义的,那么FK可以引用部分PK &我在您的示例中看到了这一点。

示例:

表A(有序,有序,软垫) PF -> orderid,orderdate

表B(OrderID,ItemID)

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

我希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16533212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档