在MS SQL中使用GUID作为主键是不是一个坏主意?

时间:2009-02-11 14:52:24

标签: sql sql-server database primary-key

我们有一个系统使用UniqueIdentifier作为每个表的主键。我们注意到这是一个坏主意。我已经看过关于这个主题的类似帖子,但我对任何MS SQL性能以及由于这个决定我可能遇到的其他潜在问题感兴趣。

12 个答案:

答案 0 :(得分:25)

有利有弊:

This article涵盖了所有内容。

GUID专业人士

  • 每个表,每个数据库,每个服务器都是唯一的
  • 允许轻松合并来自不同数据库的记录
  • 允许跨多个服务器轻松分发数据库
  • 您可以在任何地方生成ID,而不必转发到数据库
  • 大多数复制方案都需要GUID列

GUID缺点

  • 比传统的4字节索引值大4倍;如果你不小心,这会产生严重的性能和存储影响
  • 调试繁琐(其中userid ='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • 生成的GUID应该是部分顺序的,以获得最佳性能(例如,SQL 2005上的newsequentialid())并启用聚簇索引

答案 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是您最好的朋友!

相关问题