SQLServer-GuidVS.到目前为止,我一直在使用C#"Guid=Guid.NewGuid();"生成唯一ID的方法,该ID可以使用LinqtoSQL作为ID字段存储在我的一些SQLServer数据库表中。有人告诉我,出于索引原因,使用GUID不是一个好主意,我应该使用自动递增的Long。长时间使用会加速我的数据库事务吗?如果是这样,我如何生成Long类型的唯一ID?问候,两者各有利弊,这完全取决于您如何使用它们。如果您需要跨多个数据库工作的标识符,则需要GUID。Long有一些技巧(手动为每个数据库分配不同的种子/增量),但这些技巧不能很好地扩展。就索引而言,如果索引是聚集的(默认情况下,主键是聚集的,但可以为您的表修改),Long将提供更好的插入性能,因为它不需要在每次插入后重新加载组织表。然而,长(标识)列在并发插入方面会比GUID慢——标识列的生成需要一系列排他锁来确保只有一行获得下一个序列号。在许多用户一直插入许多行的环境中,这会影响性能。在这种情况下,GUID生成速度更快。在存储方面,GUID占用的空间是Long的两倍(8字节对16字节)。但是,如果8个字节适合叶子中的记录数,则取决于行的总体大小,因此在平均请求期间从磁盘获取的叶子数会产生显着差异。看看这个Isitbettertouseuniqueidentifier(GUID)orbigintasidentitycolumn?一个long(sqlserver中的bigint)是8个字节,一个Guid是16个字节,所以你将sqlserver在查找时必须比较的字节数减半。要生成长整数,请在数据库中创建字段时使用IDENTITY(1,1)。因此,请使用创建表或更改表:Field_NAMEBIGINTNOTNULLPRIMARYKEYIDENTITY(1,1)请参阅将Linq发布到sql“索引女王”的评论-KimTripp-基本上在她的索引博客文章中说了这一切明白了:基本上,她最佳实践是:最好的聚类键应该是:GUID违反“小”和“增加”,所以不是最优的。加:所有聚簇键都将添加到每个非聚簇索引中的每个单独条目(作为实际查找数据库中记录的查找),因此您希望它们尽可能小(INT=4字节与GUID=16个字节)。如果您有数亿行和多个非聚集索引,选择INT或BIGINT而不是GUID会产生很大的不同——即使只是在空间方面。当您需要考虑导入/导出到多个数据库时,请使用guid。在处理具有多个子关??系的数据集时,Guid通常比指定IDENTITY属性的列更容易使用。这是因为您可以在与数据库断开连接时在代码中随机生成guid,然后立即提交所有更改。当正确生成guid时,它们很难被意外复制。对于标识列,您通常必须在添加子数据之前对父行执行初始插入并查询其新标识。然后,所有子记录必须在提交到数据库之前用新的父ID更新。孙子孙女等也是如此。它建立了很多看似不必要和平凡的工作。您可以通过使用没有IDENTITY规范的随机整数来执行类似于Guids的操作,但是随着时间的推移插入更多的记录,发生冲突的可能性会急剧增加。(Guid.NewGuid()类似于随机Int128-尚不存在)。我将Byte(TinyInt)、Int16(SmallInt)、Int32/UInt16(Int)、Int64/UInt32(BigInt)用于不更改的小型查找列表或不在多个数据库之间复制的数据。(权限、应用程序配置、颜色名称等)我想索引需要与查询的长度一样长,无论您使用的是guid还是long。表中经常有其他字段的索引大于128位(如user表中的username)。Guids和Integers之间的区别在于内存中索引的大小,以及填充和重建索引的时间。大多数数据库事务通常是读取。很少有写作。首先关注优化数据库读取,因为它们通常包括未正确优化的连接表、不正确的分页或缺少索引。与任何事情一样,最好的办法是证明你自己的观点。创建一个包含两个表的测试数据库。一个具有整数/长整数主键,另一个具有guid。每个都填充了N百万行。在CRUD操作(创建、读取、更新、删除)期间监控每个的性能。您可能会发现它确实会降低性能,但这无关紧要。服务器通常在没有调试环境的机器上运行,而其他应用程序则占用硬盘驱动器的CPU、内存和I/O(尤其是RAID)。一个开发环境只能给你一个性能的概念。考虑从.NET应用程序创建顺序GUID:http://dotnet-snippets.de/dns/sequential-guid-SID998.aspx与标准Guid相比,顺序Guid的性能提升是什么?您可以整天争论GUID或身份。我更喜欢数据库用id生成唯一值。如果合并来自多个数据库的数据,请添加另一列(以标识源数据库,可能是tinyint或smallint)并形成复合主键。如果您确实使用身份,请确保根据您将生成的密钥的预期数量选择正确的数据类型:bigint-8字节-最大正值:9,223,372,036,854,775,807int-4字节-最大正值:2,147,483,647请注意“预期数量”键”与行数不同。如果您主要是添加和保留行,您可能会发现INT足以容纳超过20亿个唯一键。我打赌你的桌子不会那么大。但是,如果您有一个大容量表并且您不断添加和删除行,您的行数可能会很低,但您会快速遍历键。您应该进行一些计算以了解日志记录如何通过INT20亿密钥。如果短时间内不会使用它们,请使用INT,否则将密钥大小加倍并使用BIGINT。以上就是C#学习教程:SQLServer–GuidVS的全部内容。长篇分享,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
