在不那么独特的列上聚集索引插入性能?

时间:2009-03-15 03:07:53

标签: sql sql-server

根据您的经验,在非通常唯一的列上使用聚簇索引时,插入性能变得无法容忍的记录数是多少?

我能想到的一个很好的例子就是堆栈溢出的注释表。如果注释表的答案或问题表的外键上有聚簇索引,您认为插入性能是否可以接受?我假设这会导致通常查询注释的方式读取速度最快。

我经常读到聚集索引应该为唯一值列保留,但是如果这个索引最经常被这个索引查询呢?

2 个答案:

答案 0 :(得分:2)

取决于:

  • 行的大小
  • 关于填充因子(即索引中剩余的空格)
  • 表格中非聚集索引的数量
  • 重组索引的频率(注意:当聚簇索引在按字母顺序增加的密钥时不那么重要)

您应该针对您的具体情况进行基准测试。

答案 1 :(得分:2)

您应该始终尝试保持聚簇索引的唯一性。对于具有大量插入的表,类似于int标识的表是一个很好的选择,因为插入的页面通常会在内存中减少磁盘访问。

如果您不使您的聚簇索引唯一,SQL服务器将为您执行此操作,因为它仍然需要能够以某种方式找到特定的行。维护uniquifier将花费一些成本。

那么如果您希望评论表上的聚集索引是帖子ID,那该怎么办?这可能很有用,因为查找帖子的所有注释变得非常快,所有信息都在磁盘上的相同区域。

没问题,通过向其添加更多列来使索引唯一:例如:

create unique clustered index pk_comment(post_id, comment_id)  

但是......拥有此索引意味着您的索引不再单调增加,这可能会影响插入性能。它还可能影响页面拆分量。

所以,我的建议是保持简单,只需将一个主键放在comment_id上,然后根据需要在应用程序中添加覆盖索引。只有当数据在磁盘上布局的基础方式成为问题时,您才应该考虑使问题复杂化。