根据我的理解,聚集索引的一个优点是,如果它是索引列的一部分,那么在那里寻找某些东西会更快,因为行存储为“关闭”。由于SQL Server自动将主键设置为“聚簇索引”,因此将聚簇索引用于没有代理键的意义的情况是否会消除此优势,而我应该将自然键设置为聚簇索引?
答案 0 :(得分:6)
这里没有正确或错误的答案,因为它取决于。例如,聚类的优点是作为主键的IDENTITY列,而不是聚类其他内容,包括:
INT
是4个字节(如果使用数据压缩,则更少)。因此,当您有子表引用此表时,主键是瘦的非常有用,以便子表中的重复信息也是瘦的。对它进行聚类并不会对此产生任何影响,但它似乎是一种手动波动的解决方案,可以使用自然键作为聚簇索引,然后使用非聚集代理键对子表执行连接。在我看到的大多数解决方案中,代理是聚类的(并在整个模型中分布),而自然键只是变得独一无二。您是否有更好的候选群集密钥,谁知道?我们不知道您的应用程序,甚至不知道您正在考虑的自然密钥的数据类型。什么是数据模型?什么是自然键?它有可能改变吗?它大吗?它真的很独特吗?
顺便说一下,我认为默认情况下SQL Server会将PRIMARY KEY
创建为CLUSTERED
,因为(a)大多数表应该有聚簇索引,而(b)在大多数情况下密钥应该是聚集(但不是全部!)。
答案 1 :(得分:4)
聚簇索引键中所需的常规属性包括:static,narrow,increase和unique。
通常情况下,自然键不会变窄和增加。
通常,自然键不会是静态的(如电话号码),尽管它可能是唯一的。与int或bigint相比,它通常不会特别窄(如GUID或牌照)。
表是聚簇索引或堆。
聚簇索引是组织整个表数据的关键选择。它不是像非聚集索引那样的单独索引。
例如,如果聚集索引是IDENTITY,则代理键通常是一个很好的选择。
如果它是GUID,可能不是,除非它是SEQUENTIALID。
您可以看到为什么希望此聚簇索引键是静态的,因为您不希望数据行四处移动。每当密钥发生变化时,您还必须担心保持参照完整性。我更喜欢任何引用键都是静态的,因为级联更新/删除也会影响你的数据模型 - 为了什么好处,真的可以有一个静态代理而不必费心去处理所有这些重写? / p>
如果要根据该密钥读取大块数据,则在其他密钥上进行聚类是有好处的。
要回答您的问题 - 我会拒绝,但会发布您的表格设计和使用方案。