Sql server 对标识列使用uniqueidentifier(GUID)或bigint更好吗?
对于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 如果您需要能够轻松地与远程创建的记录同步,那
BIGINT
而不是GUID
(因为GUID又大又慢),但问题是,您甚至需要它吗?(即,您是否正在进行复制?)
如果您预期的行数少于20亿行,则传统的
INT
就可以了。这取决于您所做的工作:
- 如果速度是主要考虑因素,那么一个普通的老式
可能就足够大了int
- 如果您真的有超过20亿条(带B;)的记录,那么请使用
或顺序guidbigint
- 如果您需要能够轻松地与远程创建的记录同步,那么
真的很棒Guid
关于GUI的一些附加(不太明显)说明:
- 它们可能对索引很苛刻,这会降低数据库性能的核心
- 您可以使用顺序guid恢复一些索引性能,但放弃第二点中使用的一些随机性
- 手工调试guid可能很困难(
),但您也可以通过顺序guid(where id='xxx-xxx'+'123')重新获得部分guid李>where id='xxx-xxx-xxxxx'
- 出于同样的原因,guid可以使基于ID的安全攻击更加困难,但并非不可能。(你不能只键入
并期望获得其他人帐户的结果))http://example.com?userid=xxxx“
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)保存在主表和外部表中是很方便的李>
id int-identity(-2147483648,1)
。它有4个字节长,提供了40多亿个不同的值。您可以使用NEWSEQUENTIALID()创建顺序GUID字段,使索引更优化并提高性能。没有人尝试键入GUID。我确信复制/粘贴是在GUID发明的第二天发明的;-)