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

时间:2015-01-14 17:39:09

标签: sql-server sql-server-2008-r2 primary-key clustered-index

我在生产中有一个数据库应用程序,并且所有表都使用当前设置为聚簇索引的GUID主键。据我所知,由于性能考虑,这是一个糟糕的设计。我一直在阅读这个主题,包括Kimberly Tripp的this great article

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

另外,为了获得性能提升,我是否必须按创建记录的自然顺序填充现有记录的新列?

编辑:要解决此问题是否与this other question重复:另一个问题是询问有关使用GUID主键的性能注意事项的一般最佳做法。没有讨论具体方法。另一方面,我的问题是具体是否添加 INT 类型的自动递增索引列是否有助于改善GUID主要问题键。此外,我的问题然后询问我是否必须按照“自然顺序”填充新专栏以实现其中的好处,由于其更高的通用性,这一点在另一个问题中没有得到解决。

1 个答案:

答案 0 :(得分:3)

有几件事需要考虑:

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

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

  3. 要回答提高绩效的问题,您目前的问题是什么?有任何我们可以解决的数据吗?如果您现在没有任何问题,可能不值得进行更改。

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

  5. 如果对密钥使用INT列,请在GUID列上创建唯一的非聚集索引,以使优化器知道只有一个值(优化)并允许快速搜索。如果它不太昂贵,请将其覆盖。