到目前为止,我一直在使用C#“ GUID = GUID.NEWGUID();”生成可以使用LINQ到SQL的某些SQL Server数据库表中可以存储为ID字段的唯一ID的方法。我被告知,出于索引原因,使用 GUID 是一个坏主意,我应该使用自动递增的 Long 来代替。使用 long 会加速我的数据库事务吗?如果是这样,我该如何生成 Long 类型的唯一 ID?

问候,

有帮助吗?

解决方案

两者各有利弊,这完全取决于你如何使用他们的问题。

右键关闭蝙蝠,如果你需要,可以跨多个数据库工作标识,你需要的GUID。有一些技巧与龙(手动分配的每个数据库不同的种子/增量),但这些不能很好地扩展。

至于索引去,如果聚簇索引龙将给予更好的插入性能(默认情况下,主键聚集,但这是可以修改你的表),因为该表并不需要每一个被后重组插入

至于并发插入关注然而,长(同一性)的列将是慢然后GUID - 标识列生成需要一系列排他锁,以确保只有一行得到下一个序列号。在拥有众多用户插入多行所有的时间的环境中,这可能是一个性能命中。 GUID生成在这种情况下更快。

存储明智的,一个GUID占用了长的两倍的空间(8个字节比16)。然而,它取决于你行的整体大小,如果8个字节是要做出一个叶中有多少条记录适合noticable差异,因而叶片数平均请求期间从磁盘拉。

其他提示

有一个长(在SQL Server大INT)为8个字节,一个GUID是16个字节,所以你减半字节的SQL Server数量已经比较做一个查找时。

有关时在数据库中创建的字段产生长,使用IDENTITY(1,1)。

因此无论使用创建表或alter table:

Field_NAME BIGINT NOT NULL PRIMARY KEY IDENTITY(1,1)

请参阅评论张贴的LINQ to SQL

“索引女王”—— 金特里普 - 基本上在她的索引博客文章中说明了一切:

基本上,她的最佳实践是:最佳聚类键应该是:

  • 独特的
  • 小的
  • 稳定(不变)
  • 不断增加

GUID 违反了“小”和“不断增加”的原则,因此不是最佳的。

加:所有聚集键都将添加到每个非聚集索引中的每个条目(作为实际在数据库中查找记录的查找),因此您希望使它们尽可能小(INT = 4)字节对比GUID = 16 字节)。如果您有数亿行和多个非聚集索引,那么选择 INT 或 BIGINT 而不是 GUID 可能会产生重大影响 - 即使只是在空间方面。

马克

当你需要考虑导入/导出到多个数据库使用的GUID。 GUID是往往容易比多子女关系的数据集工作时指定IDENTITY属性列使用。这是因为你可以随意在从数据库断开状态的代码生成的GUID,然后一次提交所有更改。当GUID是正确生成,它们是insainely很难偶然复制。带有标识列,你经常做父行和查询的INTIAL插入它的添加子数据之前,新的身份。然后,您必须将它们提交到数据库之前更新与新的母公司身份的所有子记录。这同样适用于孙子等上下层次结构。它建立了一个大量的工作,似乎没有必要和世俗。您可以通过使用不规范IDENTITY随机整数最多正在添加做类似的GUID的东西,但是当你随着时间的推移插入更多的记录碰撞的机会大大增加。 (Guid.NewGuid()类似于一个随机Int128 - 这还不存在)。

我用字节(TINYINT),Int16类型(SMALLINT)的Int32 / UINT16(INT),的Int64 / UInt32的(BigInt有)为小查找列表不改变或不多个数据库之间复制数据。 (权限,应用程序配置,颜色名称等)

我想象中的索引只需只要你使用的是GUID或长对查询不管。通常有在表中其它字段被索引是大于128位反正(在例如用户表的用户名)。 guid和整数之间的差是在存储器中的索引,以及时间和填充重建索引的大小。大多数数据库事务的经常阅读。写作是最小的。集中于优化从数据库读取第一个,因为它们通常是由那些没有适当优化联接表,不当寻呼或缺失索引的。

至于用什么,做的最好的事情就是证明你的观点。创建一个测试数据库包含两个表。一个与整数/多头的主键,并与一个GUID另一个。填充每个与N-万行。在CRUD操作(创建,读取,更新,删除)箴言报各的性能。你可能会发现,它确实有一个性能命中,但微不足道。

服务器常常没有调试环境和其它应用占用CPU,内存上盒运行,我的硬盘驱动器(特别是与RAID)的/ O。开发环境不仅给你的表演的想法。

您可以讨论GUID或身份一整天。我更喜欢数据库,生成具有标识的独特价值。如果从多个数据库中的数据合并,添加另一个柱(来识别源数据库,可能一个或TINYINT SMALLINT)和形成复合主键。

如果你用的身份去的,一定要选择正确的数据类型,根据预期键,你会产生数:

bigint - 8 Bytes - max positive value: 9,223,372,036,854,775,807  
int    - 4 Bytes - max positive value:             2,147,483,647

请注意“数预期键”比的行数不同。如果你主要是增加和保持行,你可能会发现一个INT是足够用超过2十亿唯一的密钥。我敢打赌,你的表不会得到那么大。但是,如果你有,你不断添加和删除行的高容量表,行计数可能较低,但你快速办理密钥。你应该做一些计算,看看它是如何登录需要去通过的INT 2个十亿键。如果不使用他们的任何时间很快与INT走,否则双倍的密钥大小与BIGINT去。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top