使用广泛的 PK 与单独的合成密钥和 UQ 之间的性能考虑是什么?

Jon*_*des 10 database-design primary-key index-tuning unique-constraint

我有几个表,其中的记录可以用几个广泛的业务领域唯一标识。过去,我将这些字段用作 PK,并考虑到以下好处:

  • 简单; 没有多余的字段,只有一个索引
  • 聚类允许快速合并连接和基于范围的过滤器

但是,我听说过一个创建合成IDENTITY INTPK的案例,而是使用单独的UNIQUE约束来强制执行业务密钥。优点是狭窄的 PK 使得二级索引小得多。

如果一个表没有比PK其他指标,我看不出有任何理由赞成第二种方法,虽然在一个大表它可能是最好的假设,指数可能在未来是必要的,因此,有利于在狭窄合成PK . 我是否缺少任何考虑?

顺便说一下,我并不是反对在数据仓库中使用合成键,我只是对何时使用单一的宽泛 PK 以及何时使用窄 PK 加上宽泛的 UK 感兴趣。

gbn*_*gbn 11

使用自然键作为聚集索引没有明显的缺点

  • 没有非聚集索引
  • 没有引用此表的外键(它是父行)

缺点是页面拆分会增加,因为数据插入将分布在整个数据中,而不是在最后。

在有 FK 或 NC 索引的情况下,使用窄的、数字的、递增的聚集索引具有优势。对于每个 NC 或 FK 条目,您只需重复几个字节的数据,而不是 while 业务/自然键。

至于为什么,请阅读Google 的 5 篇文章

注意我避免使用“主键”。

您可以在代理键上使用聚集索引,但将 PK 保留在业务规则上,但作为非聚集索引。只要确保集群是唯一的,因为 SQL 会添加一个“唯一标识符”来实现它。

最后,在每张表上都有一个代理键可能是有意义的,但不是盲目的:很多表不需要一个,或者来自父表的复合键就足够了

  • +1 表示性能与主键无关,而与索引无关。 (2认同)