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

标签 sql-server sql-server-2008

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

最佳答案

这里没有正确或错误的答案,视情况而定。聚类的优点,例如,作为主键的 IDENTITY 列,相对于其他东西的聚类,包括:

  • 消除“坏”页面拆分,因为不断增加的值总是插入在表/分区的“末尾”(这会引入“热点”——如果您以非常高的速度插入,这可能会成为一个问题)。
  • 使用搜索或扫描查找行或范围时不需要查找 - 如果您使用非聚集索引来标识行,则可能需要查找来检索任何未覆盖的列。
  • INT是 4 个字节(如果使用数据压缩则更少)。所以当你有引用这个表的子表时,主键是瘦的非常有用,这样子表中的重复信息也是瘦的。将它聚集起来并没有太大的影响,但它似乎是一种手动解决方案,即为聚集索引使用自然键,然后使用非聚集代理键执行到子表的连接。在我见过的大多数解决方案中,代理是聚集的(并分布在整个模型中),并且自然键只是简单地唯一。

  • 你是否有更好的聚类键候选,谁知道呢?我们不知道您的应用程序,甚至不知道您为自然键考虑的数据类型。什么是数据模型?什么是自然键?有可能改变吗?它很大吗?它真的独一无二吗?

    顺便说一句,我喜欢认为 SQL Server 创建了 PRIMARY KEYCLUSTERED默认情况下,因为 (a) 大多数表应该有一个聚集索引和 (b) 在大多数情况下,键应该是聚集的(但不是全部!)。

    关于sql-server - 我应该从代理键中删除聚集索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18623671/

    相关文章:

    sql-server-2005 - 数据库 |字符串比较

    c# - 如何在 SQL Server 中包含一个可选的空参数

    python - 如何在pandas read_Sql中复制并粘贴sql查询

    sql-server-2008 - 在 SQL Server 2008 中使用表变量执行动态 SQL 查询时出错

    sql-server-2005 - 这里可以使用 Common Table 表达式来提高性能吗?

    sql - 简单的自连接查询性能不佳

    sql-server-2008 - 优化器忽略过滤的索引条件

    sql-server - 如何使用 sql server 2008 安全地销毁一些数据? (使用 DoD 安全删除或等效工具)

    c# - ServiceStack Ormlite OnDelete ="CASCADE"不工作

    sql - 连接两个临时表