Sql server 对标识列使用uniqueidentifier(GUID)或bigint更好吗?

Sql server 对标识列使用uniqueidentifier(GUID)或bigint更好吗?,sql-server,Sql Server,对于SQL server,对标识列使用uniqueidentifier(GUID)或bigint更好吗 一般来说,我建议使用BIGINT而不是GUID(因为GUID又大又慢),但问题是,您甚至需要它吗?(即,您是否正在进行复制?) 如果您预期的行数少于20亿行,则传统的INT就可以了。这取决于您所做的工作: 如果速度是主要考虑因素,那么一个普通的老式int可能就足够大了 如果您真的有超过20亿条(带B;)的记录,那么请使用bigint或顺序guid 如果您需要能够轻松地与远程创建的记录同步,那

对于SQL server,对标识列使用uniqueidentifier(GUID)或bigint更好吗

一般来说,我建议使用
BIGINT
而不是
GUID
(因为GUID又大又慢),但问题是,您甚至需要它吗?(即,您是否正在进行复制?)
如果您预期的行数少于20亿行,则传统的
INT
就可以了。

这取决于您所做的工作:

  • 如果速度是主要考虑因素,那么一个普通的老式
    int
    可能就足够大了
  • 如果您真的有超过20亿条(带B;)的记录,那么请使用
    bigint
    或顺序guid
  • 如果您需要能够轻松地与远程创建的记录同步,那么
    Guid
    真的很棒
更新
关于GUI的一些附加(不太明显)说明:

  • 它们可能对索引很苛刻,这会降低数据库性能的核心
  • 您可以使用顺序guid恢复一些索引性能,但放弃第二点中使用的一些随机性
  • 手工调试guid可能很困难(
    where id='xxx-xxx-xxxxx'
    ),但您也可以通过顺序guid(where id='xxx-xxx'+'123')重新获得部分guid
  • 出于同样的原因,guid可以使基于ID的安全攻击更加困难,但并非不可能。(你不能只键入
    )http://example.com?userid=xxxx“
    并期望获得其他人帐户的结果)

这实际上取决于输入的信息是否以某种方式连续。我强烈建议用户使用GUID可能更好。但对于顺序数据,如订单或其他需要轻松排序的内容,bigint可能是更好的解决方案,因为它将被索引并提供快速排序,而不需要另一个索引。

不取决于您需要什么。DB性能将从integer中获益,而GUI对于复制非常有用,并且不需要从DB那里听到创建了什么标识,即代码可以在插入行之前创建GUID标识。

这实际上取决于您是否希望在图片中进行复制。复制需要一个行UUID,因此如果您计划这样做,您最好先这样做。

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

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

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

我和安德鲁·罗林斯在一起

现在你可以讨论空间效率了。整数是什么,最多8字节?guid将要长得多

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

至于访问时间,请注意,一些数据库可能会开始在guid上出现大问题。我知道MySQL()就是这样。这对于SQL Server来说可能不是什么大问题,但需要注意


我会说坚持使用INT或BIGINT。我认为您想要GUID的唯一时间是,出于安全原因,您将给出GUID,并且不希望人们能够猜测其他记录的ID。

使用GUID的方面或要求可能很少

  • 如果主键是任何数字类型(Int、BigInt或任何其他),则需要将其设为标识列,或者需要检查表中最后保存的值
  • 在这种情况下,如果外部表中的记录保存为事务,则很难获取主键的最后一个标识值。如果使用了IDENT_CURRENT,则在外键中保存记录时会再次影响性能
  • 因此,在将记录保存为事务的情况下,首先为主键生成Guid,然后将生成的键(Guid)保存在主表和外部表中是很方便的
您是指主键吗?不能有GUID标识列。Jeff Atwood已经回答了所有问题。那不是20亿行吗?INT已签名。;)可以我将去掉-1即使id是int,我也会使用一个额外的guid列来提供URL使用的查找。。。或者是一个额外的相关参数来防止这种攻击。我不认为guid在连接中会更快。。。现代处理器一次处理32或64位的数字。@AndrewRollings,“那不是20亿行吗?”-不,“INT是有符号的。”-它不会改变任何东西。提示:
id int-identity(-2147483648,1)
。它有4个字节长,提供了40多亿个不同的值。您可以使用NEWSEQUENTIALID()创建顺序GUID字段,使索引更优化并提高性能。没有人尝试键入GUID。我确信复制/粘贴是在GUID发明的第二天发明的;-)