【问题标题】:oracle composite primary key vs indexoracle复合主键与索引
【发布时间】:2015-04-13 17:21:19
【问题描述】:

我正在设计一个有多个外键的表。我所做的是为主键创建一个额外的列,它将更多地用作关联,但我也可以将外键作为复合主键。 所以我的问题是关于性能的:复合主键是否比索引更好(至少对于 Oracle 而言)?什么对我的情况更好? 谢谢!

【问题讨论】:

  • 什么更好?插入?使用复合键查询?基于复合键 part 的查询 ?
  • @SylvainLeroux 我澄清一下,对于基于外键列的选择查询更好,数据量相对较少

标签: oracle performance composite-primary-key


【解决方案1】:

正如@Sylvain_Leroux 指出的那样,“更好”这个词实际上非常含糊,具体取决于您的目标,因为这两种方法都需要权衡取舍。

确保复合键实际上是唯一的

首先,如果您想使用外键中的复合主键,那么您必须确保外键的组合对于每条记录都是真正唯一的。否则,当然,您将无法将它们用作主键。相反,如果您描述的是使用由外键和代理键组成的复合键,那么这就是两全其美的结果,而且通常不受欢迎。

ETL 后台注意事项

您正在考虑的选择是 OLAP 中的常见选择,其中设计人员必须选择是对事实表使用代理键还是使用由维度表的键组成的复合键。因此,来自 Ralph Kimball 的 The Data Warehouse Toolkit Third Edition 第 487 页的建议适用于您的情况(您可以认为您的表类似于他所描述的事实表,并且外键是对于他称之为维度的表格):

事实表代理键在 ETL 后台有多种用途。首先,如前所述,它们可以用作退出或恢复中断负载的基础。其次,它们提供了对单个事实行的即时且明确的标识,而无需限制多个维度来获取唯一行。第三,对事实表行的更新可以用插入加删除来代替,因为事实表代理键现在是事实表的实际键。因此,现在可以将包含更新列的行插入到事实表中,而不会覆盖要替换的行。当所有此类插入都完成后,可以在一个步骤中删除底层的旧行。第四,事实表代理键是在父/子设计中使用的理想父键。事实表代理键与父维度外键一起在子级中显示为外键。

性能注意事项

从性能的角度来看,记录按物理上的主键顺序存储在磁盘上。这使得基于使用外键(或外键)进行查找的查询的读取速度更快,但也可能意味着如果它们需要在末尾以外的点插入记录,则写入速度会更慢。这是因为 DBMS 必须物理移动记录以腾出空间(这有点过于简单了,因为 DBMS 采用了一些方案来解决这个问题,但如果插入足够多,它们就会不堪重负)。

如果您要使用代理键,则插入问题不会成为问题,但当然,在您通过外键查找的情况下,您不会获得让数据物理有序的优势磁盘上。假设您将在每个外键上放置一个索引,那么这会增加一些插入任务的开销,因为 DBMS 必须更新多个索引。

所有这些只有在数据量很大时才会注意到,而对于相对少量的数据不会有太大的影响。

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多