我们的数据存储在一个SQL Server 2008数据库中,表与表之间将有大量的查询和连接。我们团队内部有一个争论,有人主张使用整数身份作为主键可以获得更好的性能,而有些人则主张使用GUID(全局唯一标识符)。
使用GUID作为主键是否会严重影响性能?
使用GUID作为主键是否会严重影响性能?
最终,通过使用整数来挤出一些小的性能优势可能不值得失去GUID的优势。根据实际情况进行测试并自行决定。
就我个人而言,在不同情况下我仍然会使用两者,但决定因素从未真正取决于性能。
我通常使用 INT IDENTITY
作为大多数主键和聚集键。
需要区分的是,主键 是一个逻辑结构,用于唯一标识行,必须是唯一且稳定的,同时不能为 NOT NULL
。GUID 也可以作为主键,因为它保证唯一性。如果您使用 SQL Server 复制,那么将 GUID 作为主键是一个不错的选择,因为在这种情况下,您必须拥有一个唯一标识 GUID 列。
SQL Server 中的 聚集键 是一个物理结构,用于数据的物理排序,而且更难以正确设置。通常,SQL Server 索引之后的女王 Kimberly Tripp 还要求好的聚集键必须是唯一、稳定、尽可能窄,并且最好是单调递增的(所有这些都适用于 INT IDENTITY
)。
请参阅她关于索引的文章:
此外,还可以看看 Jimmy Nilsson 的文章:The Cost of GUIDs as Primary Key
一个GUID作为聚集键是非常糟糕的选择,因为它宽,完全随机,因此会导致索引碎片和性能下降。此外,聚集键行也会存储在每个非聚集(附加)索引的每个条目中,因此您需要确保其尽可能小——GUID为16字节,而INT为4字节,在多个非聚集索引和数百万行的情况下,这将产生巨大的差异。因此,当您需要合并来自多个来源的数据时,它们是一个很好的解决方案。
来源:http://www.sqlteam.com/article/uniqueidentifier-vs-identity
UNIQUEIDENTIFIER
作为主键并创建聚集索引,那么最大的性能和碎片化问题就会出现。 - Lamakuniqueidentifier
数据类型本身导致的。如果您为整数ID使用随机数字,则会遇到同样的问题。使用NEWSEQUENTIALID()
或类似 COMB 的方法,就不应该是一个真正的问题。 - richardtallent