我应该从代理键中删除聚集索引吗?

时间:2013-09-04 20:59:26

标签: sql-server sql-server-2008

根据我的理解,聚集索引的一个优点是,如果它是索引列的一部分,那么在那里寻找某些东西会更快,因为行存储为“关闭”。由于SQL Server自动将主键设置为“聚簇索引”,因此将聚簇索引用于没有代理键的意义的情况是否会消除此优势,而我应该将自然键设置为聚簇索引?

2 个答案:

答案 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>

如果要根据该密钥读取大块数据,则在其他密钥上进行聚类是有好处的。

要回答您的问题 - 我会拒绝,但会发布您的表格设计和使用方案。