oracle复合主键vs索引

时间:2015-04-13 17:21:20

标签: oracle performance composite-primary-key

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

1 个答案:

答案 0 :(得分:1)

正如@Sylvain_Leroux所指出的,术语“更好”"实际上根据你的目标非常模糊,因为这两种方法都存在权衡。

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

首先,如果要使用外键中的复合主键,则必须确保外键的组合对于每个记录都是真正唯一的。否则,当然,您无法将它们用作主键。相反,如果您正在描述使用由外键和代理键组成的复合键,那么这两种情况都是最糟糕的,并且通常不赞成。

ETL后房间注意事项

您正在考虑的选择是OLAP中的常见选择,其中设计者必须选择是否对事实表使用代理键,或者是否使用维度表的键组成的复合键。因此,来自Ralph Kimball的数据仓库工具包第三版的第487页的建议适用于您的情况(您可以认为您的表格类似于他所描述的事实表格,并且外键用于表示为维度的表:

  

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

性能注意事项

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

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

所有这一切只有大量数据才会引起注意,并且对于相对少量的数据不会产生太大影响。