根据您的经验,在非通常唯一的列上使用聚簇索引时,插入性能变得无法容忍的记录数是多少?
我能想到的一个很好的例子就是堆栈溢出的注释表。如果注释表的答案或问题表的外键上有聚簇索引,您认为插入性能是否可以接受?我假设这会导致通常查询注释的方式读取速度最快。
我经常读到聚集索引应该为唯一值列保留,但是如果这个索引最经常被这个索引查询呢?
答案 0 :(得分:2)
取决于:
您应该针对您的具体情况进行基准测试。
答案 1 :(得分:2)
您应该始终尝试保持聚簇索引的唯一性。对于具有大量插入的表,类似于int标识的表是一个很好的选择,因为插入的页面通常会在内存中减少磁盘访问。
如果您不使您的聚簇索引唯一,SQL服务器将为您执行此操作,因为它仍然需要能够以某种方式找到特定的行。维护uniquifier将花费一些成本。
那么如果您希望评论表上的聚集索引是帖子ID,那该怎么办?这可能很有用,因为查找帖子的所有注释变得非常快,所有信息都在磁盘上的相同区域。
没问题,通过向其添加更多列来使索引唯一:例如:
create unique clustered index pk_comment(post_id, comment_id)
但是......拥有此索引意味着您的索引不再单调增加,这可能会影响插入性能。它还可能影响页面拆分量。
所以,我的建议是保持简单,只需将一个主键放在comment_id上,然后根据需要在应用程序中添加覆盖索引。只有当数据在磁盘上布局的基础方式成为问题时,您才应该考虑使问题复杂化。