GUID 主键,单独的聚集索引列

GUID primary key, separate clustered index column

我有一个生产中的数据库应用程序,所有表都使用当前设置为聚簇索引的 GUID 主键。我知道出于性能考虑,这是一个糟糕的设计。我已经阅读了很多关于该主题的文章,包括金伯利·特里普 (Kimberly Tripp) 的 this great article

是否可以通过简单地创建一个INT类型的自增索引列并将其设置为聚簇索引来提高性能?我从 Kimberly 的文章中了解到,所有非聚集索引(如我以后的 GUID 主键,如果我这样做)都将引用聚集索引。但是,如果我在 WHERE 子句中使用 GUID 主键搜索记录,这实际上会提高性能吗?

此外,我是否必须按照创建记录时的自然顺序为现有记录填充新列以实现性能提升?

编辑: 解决这个问题是否与 this other question 重复:另一个问题是询问关于使用性能考虑的一般最佳实践GUID 主键。没有讨论具体的方法。另一方面,我的问题是具体询问添加类型INT的自动递增索引列是否有助于改善GUID 主键的问题。此外,我的问题然后询问我是否必须在他们的 "natural order" 中填充新列以实现好处,由于其更高的普遍性,另一个问题也没有解决。

有几点需要考虑:

  1. 是的,您是对的,聚簇索引键将出现在所有非聚簇索引中。使用较小的密钥将有助于 space 节省磁盘和缓冲池。

  2. 拥有身份的聚簇键将使您结束 table 插入,并可能(取决于负载)使其成为插入热点。现在的 GUID 是随机插入的,不会提供太多热点,但会导致更多的页面拆分,这也可能对性能产生不利影响。

  3. 要回答提高性能的问题,您当前的问题领域是什么?有任何我们可以利用的数据吗?如果您现在没有任何问题,可能不值得进行这些更改。

  4. 当您将列添加为标识时,它应该自行播种并且顺序真的不重要。

  5. 如果您确实使用 INT 列作为键,请在 GUID 列上创建一个唯一的非聚集索引,让优化器知道只有一个值(优化)并允许快速搜索。如果不是太贵的话就盖起来吧