使用uniqueidentifier(GUID)或bigint作为标识列是否更好?

时间:2009-02-02 21:08:03

标签: sql-server

对于SQL服务器,最好是为标识列使用uniqueidentifier(GUID)还是bigint?

10 个答案:

答案 0 :(得分:48)

这取决于你在做什么:

  • 如果速度是主要关注点,那么普通的int可能就足够了。
  • 如果你真的有超过20亿(带有B;))记录,那么使用bigint或顺序guid。
  • 如果您需要能够轻松地与远程创建的记录同步,那么Guid真的很棒。

<强>更新
关于Guids的一些额外的(不那么明显的)笔记:

  • 它们可能对索引很难,而且会削弱数据库性能的核心
  • 您可以使用顺序guid来恢复某些索引性能,但放弃第二点中使用的一些随机性。
  • Guids可能难以手动调试(where id='xxx-xxx-xxxxx'),但您也可以通过顺序guid(where id='xxx-xxx' + '123')获得一些回复。
  • 出于同样的原因,Guids可以使基于身份的安全攻击变得更加困难 - 但并非不可能。 (您不能只键入'http://example.com?userid=xxxx'并期望获得其他人帐户的结果。

答案 1 :(得分:7)

一般情况下,我推荐BIGINT超过GUID(因为指针大而慢),但问题是,你甚至需要吗? (即你在复制吗?) 如果您期望行少于20亿行,那么传统的INT就可以了。

答案 2 :(得分:4)

您是在进行复制还是有销售人员运行需要合并的断开连接的数据库,请使用GUID。否则我会选择int或bigint。从长远来看,它们更容易处理。

答案 3 :(得分:1)

不要求你需要的东西。数据库性能将从整数中获益,而GUID对于复制非常有用,并且不需要从数据库中回听已创建的身份,即代码可以在插入行之前创建GUID身份

答案 4 :(得分:1)

如果您计划使用合并复制,则ROWGUIDCOL有利于提高性能(see here for info)。否则,我们需要更多关于“更好”的定义的信息;更好的是什么?

答案 5 :(得分:0)

这实际上取决于进来的信息是否有某种程度的顺序。我强烈推荐GUID可能更好的用户等用户。但是对于顺序数据,例如需要易于排序的订单或其他东西,bigint可能是一个更好的解决方案,因为它将被索引并提供快速排序而不需要另一个索引的成本。

答案 6 :(得分:0)

这取决于你是否期望在图片中复制。复制需要一行UUID,所以如果你打算这样做,你也可以预先做好。

答案 7 :(得分:0)

除非您真正需要GUID,例如能够在任何地方而不仅仅是在服务器上生成密钥,否则我会坚持使用基于INTEGER的密钥。 GUID的创建成本很高,并且使实际查看数据变得更加困难。另外,您是否曾尝试在SQL查询中键入GUID?这很痛苦!

答案 8 :(得分:0)

我和Andrew Rollings在一起。

现在你可以争论空间效率。 int是什么,最多8个字节?指导会持续更长时间。

但我有两个主要的偏好原因:可读性和访问时间。对于我而言,数字比GUID更容易(因为我总能轻松找到下一个/上一个记录)。

至于访问时间,请注意某些DB可能会开始出现GUID的大问题。我知道MySQL就是这种情况(MySQL InnoDB Primary Key Choice: GUID/UUID vs Integer Insert Performance)。这对SQL Server来说可能不是什么大问题,但需要注意的是。

我会坚持使用INT或BIGINT。我认为你想要GUID的唯一一次是当你要把它们给出时,并且不希望人们出于安全原因猜测其他记录的ID。

答案 9 :(得分:0)

使用GUID可能会有更多方面或要求。

  • 如果主键是任何数字类型(Int,BigInt或任何其他),那么您需要将其设置为Identity列,或者您需要检查表中最后保存的值。
  • 在这种情况下,如果将外表中的记录保存为事务,则很难获得主键的最后一个标识值。就像使用IDENT_CURRENT一样,那么在保存外键中的记录时会再次影响性能。
  • 因此,在保存记录和事务的情况下,首先为主键生成Guid,然后将生成的密钥(Guid)保存在主表和外表中会很方便。