架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1290|回复: 2

[资料] 【转】(MSSQL)SQL Server 数据库 int 和 guid 做主键比较

[复制链接]
发表于 2023-6-6 22:17:40 | 显示全部楼层 |阅读模式
需求:最近面试的时候被问到 SQL Server 数据库 int 和 guid 做主键有什么区别,两者做主键虽然都用到过,但是,并没有深入的了解,两者均有利弊,请根据自己实际业务场景进行权衡

原文一https://www.cnblogs.com/dullbaby/p/5112386.html

使用INT做主键的优点:

1、需要很小的数据存储空间,仅仅需要4 byte 。

2、insert和update操作时使用INT的性能比GUID好,所以使用int将会提高应用程序的性能。

3、index和Join 操作,int的性能最好。

4、容易记忆。

5、支持通过函数获取最新的值,如:Scope_Indentity() 。

使用INT做主键的缺点

1、如果经常有合并表的操作,就可能会出现主键重复的情况。

2、使用INT数据范围有限制。如果存在大量的数据,可能会超出INT的取值范围。

3、很难处理分布式存储的数据表。

使用GUID做主键的优点:

1、它是独一无二的。

2、出现重复的机会少。

3、适合大量数据中的插入和更新操作。

4、跨服务器数据合并非常方便。

使用GUID做主键的缺点:

1、存储空间大(16 byte),因此它将会占用更多的磁盘大小。

2、很难记忆。join操作性能比int要低。

3、没有内置的函数获取最新产生的guid主键。

4、GUID做主键将会添加到表上的所以其他索引中,因此会降低性能。

总结:

上面列出了GUID和INT两种数据类型做主键优缺点。我觉得,对于大数据量,建议使用guid做主键。而使用int会得到最佳的性能


评论:使用有序的GUID性能会提高很多

原文二https://qa.social.msdn.microsoft.com/Forums/expression/zh-CN/70740eaa-bbb6-4cba-8693-a11e712869fa/sqlguididentity?forum=sqlserverzhchs

identity 是整武型类型就可以了, decimal不带小数的定义, bigint 均可

guid 是固定的 binary(16), 也就是16个字节

identity 是递增(或减), 而 guid 是随机的, 所以随着数据的插入, 前者不会产生什么碎片, 而后者会, 并且由于后者是无序的, 插入时还得调整顺序,所以性能上, 一般是前者优于后者.

大量信息一般会分表, 所以identity在很多情况下还是比较适用的

至于主键的意义, 这个看你设计时是怎么考虑的, 对于数据处理本身而言, 主键并不需要有意义, 而如果你要求主键中包含业务意义的话, 那么identity主键当然就是没意义的, 但一般来说, 业务意义和数据处理分开会更好一些, 业务始终是变化的, 如果你要把意义带到表设计的主键中, 那么业务变化, 你要调整的表结构也会比较多.

原文三https://www.cnblogs.com/xdot/p/6054415.html

1.在经常需要做数据迁移的系统中,建议用Guid。并且在相应的外键字段,也就是用来做连接查询的字段添加非聚集索引,对于改善性能有极大的好处。where条件的字段也可以适当添加非聚集索引。

2.在使用Guid类型作为主键时,数据类型应为uniqueidentifier,并且一定要记得取消主键的“聚集索引

3.对于不需要做迁移,或小型系统,用int做主键还是很方便的,并且在效率方面还是有一定提升的。

(完)




上一篇:ASP.NET Core(二十)预防开放式重定向攻击
下一篇:.NET Core 程序多语言之读写资源 (.resx) 文件
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2023-6-6 22:42:46 | 显示全部楼层
SequentialGuidValueGenerator  生成经过优化以用于 Microsoft SQL Server 群集键或索引的顺序Guid值,从而产生比随机值更好的性能。这是设置为在添加时生成的SQL Server Guid列的默认生成器。

https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.valuegeneration.sequentialguidvaluegenerator?view=efcore-7.0


Entity Framework Core 中的顺序 GUID 可能不是顺序的

https://dev.to/connerphillis/sequential-guids-in-entity-framework-core-might-not-be-sequential-3408
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-1-27 11:07:29 | 显示全部楼层
[MSSQL]SQL SERVER 有序 GUID 和无序 GUID 作为主键聚集索引测试
https://www.itsvse.com/thread-10607-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-5-29 14:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表