我们有一个系统使用UniqueIdentifier作为每个表的主键。我们注意到这是一个坏主意。我已经看过关于这个主题的类似帖子,但我对任何MS SQL性能以及由于这个决定我可能遇到的其他潜在问题感兴趣。
答案 0 :(得分:25)
有利有弊:
This article涵盖了所有内容。
GUID专业人士
GUID缺点
答案 1 :(得分:17)
我上周写了一篇关于这个的帖子,其中有一些代码可以告诉你会发生什么:Some Simple Code To Show The Difference Between Newid And Newsequentialid
基本上如果你使用newid()而不是Newsequentialid(),如果你的PK是一个聚集索引(默认情况下会是这样),你会得到可怕的页面拆分。
答案 2 :(得分:15)
就我个人而言,我会使用int或bigint作为PK,但只需在另一个“Guid”列中输入您需要该记录的不可取“密钥”的情况,并在插入行时生成Guid
答案 3 :(得分:4)
如果您需要在大型集合上进行连接(假设为100,000次),那将会很糟糕。去过那里,受苦了。
后来编辑:我还遇到了更糟糕的搞砸(不能称之为“方法”):将GUID存储在char(36)列中!!
答案 4 :(得分:3)
GUID是一种用于标识行的强大数据类型,因为它几乎保证是唯一的,这允许很多灵活性,例如,您可以在应用程序层中生成Guid,这可以极大地简化保存关系。
正如所说的那样,最大的缺点是如果您的PK是聚集索引,将会发生页面拆分;但是,你可以通过两种方式解决这个问题。您可以使用NewSequentialId(),也可以将PK设置为非群集。我建议您根据数据要求构建数据库,如果需要GUID使用它,然后围绕它进行优化。并验证其在您的环境中的性能。
答案 5 :(得分:3)
Jimmy Nilsson wrote a fantastic article about GUIDs vs. INTs and combined GUIDS。 结论......无论如何,不要害怕GUID ......好的复合材料。
答案 6 :(得分:1)
这是一个“坏”的想法。它可能很慢。你使用索引快速搜索也不是很好。我们使用GUID或UniqueID的唯一实时是我们必须保持数据库跨数据库连接,通常当我们有一个服务器数据库和一个应用程序的本地数据库(对于断开连接的系统)。除了guids之外,你真的没有其他方法可以将事物保持在一起。对于索引和主键,您希望使用整数值并尝试将事物与关联表链接,而不是在整个地方使用guid。
答案 7 :(得分:1)
我找到使用它们的最佳原因是复制数据库时。即使这样,也可以有更好的方法来处理包括ID和位置在内的多部分主键。如果你不需要这种能力,我建议坚持使用某种形式的整数。
答案 8 :(得分:0)
如果要快速写入数据库,那就太糟糕了。如果要进行大量插入,那么最好使用不同的数据类型。
答案 9 :(得分:0)
它还可以真正减慢数据库读取速度,因为主键是使用聚簇索引创建的,除非另有说明。 guid是最糟糕的类型,因为你的聚簇索引和int或bigint可以作为更好的主键或聚簇索引
答案 10 :(得分:0)
本身我不会说糟糕。我和许多发誓的人谈过,虽然我发现它有点冗长。我同意routeNpingme
并说你应该使用一个常规整数作为ID,但也包括一个GUID(无论如何你需要复制)“以防万一”
答案 11 :(得分:-1)
如果您正在进行任何类型的数据库复制,GUID是您最好的朋友!