CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

讨论有关GUID的优劣

楼主soaringsouth(栈桥捉鳖)2006-12-31 15:28:32 在 MS-SQL Server / 基础类 提问

公司新项目,主键都采用的GUID类型,请各位高手发表一下自己的看法。 问题点数:100、回复次数:66Top

1 楼caixia615(*^_^*)‵My ɡīr!.ˊ想念妳ˋ 。(*^_^*)回复于 2006-12-31 15:29:12 得分 0

关注下哈~Top

2 楼caixia615(*^_^*)‵My ɡīr!.ˊ想念妳ˋ 。(*^_^*)回复于 2006-12-31 15:30:21 得分 0

SQL中有这个数据类型么?Top

3 楼lovcal(枫兮)回复于 2006-12-31 16:03:06 得分 0

问下楼主:栈桥捉鳖   ?是深圳的么?  
   
  80405046??Top

4 楼glacier111(★冰河★)回复于 2006-12-31 16:08:41 得分 0

SQL   Server中好像没有GUID类型吧Top

5 楼soaringsouth(栈桥捉鳖)回复于 2006-12-31 16:13:20 得分 0

lovcal(枫兮)   (   )   是谁?Top

6 楼lovcal(枫兮)回复于 2006-12-31 16:14:17 得分 0

80405046是不是你的QQ?Top

7 楼bugchen888(臭虫)回复于 2006-12-31 16:14:43 得分 50

GUID与Identity的优缺点:  
  前者是全球唯一的,如果同一个Table在多个DB,或者在多个Server中存在,而到了某个时候这些相同Schema的Table中的数据要合并到一起,这个时候GUID的优势就体现出来了。这些数据的ID绝对不会发生重复。  
   
  [bookonline]中的描述  
  自动编号和标识符列  
  对任何表都可创建包含系统所生成序号值的一个标识符列,该序号值唯一标识表中的一行。例如,当在表中插入行时,标识符列可自动为应用程序产生唯一的客户收据号码。标识符列在其所定义的表中包含的数值通常是唯一的。这意味着在包含标识符列的其它表中可使用与之相同的数值进行标识。但是,由于标识符值通常是在一个独立表的上下文中使用而不与其它表中的标识符列发生关联,所以通常不会发生问题。  
   
  可在每个表上创建一个全局唯一标识符列,而该列中包含对世界上所有网络计算机均不重复的值。当必须对来自多个数据库系统的相似数据进行合并时(例如,在包含位于世界各地分公司的数据的客户帐单系统中),包含全局唯一值的列很有用。当数据汇集到中心进行合并和制作报表时,使用全局唯一值可防止不同国家/地区的客户拥有相同的帐单号或客户   ID。  
   
  Microsoft®   SQL   Server™   2000   在合并复制中使用全局唯一标识符列,以确保在表的多个复本间唯一标识行。  
   
  如果没有前文所述的那种需求发生,不建议使用GUID,它的性能比int类型的identity差很多。Top

8 楼lovcal(枫兮)回复于 2006-12-31 16:23:38 得分 20

同意,使用GUID当主键除非有必要,一般来说不推荐  
   
  想想在一堆乱七八糟的数据上作索引,性能较差的  
   
  而一般的情况下,主键当索引使用得较多Top

9 楼zheninchangjiang(徐若涵)回复于 2006-12-31 22:31:30 得分 0

personalTop

10 楼sdhylj(青锋-SS)(献血有益健康(别人的))回复于 2006-12-31 22:34:03 得分 0

进来学习.Top

11 楼hellowork(一两清风)回复于 2006-12-31 23:46:03 得分 0

如果没有复制,尽量不要采用GUID,GUID主要是解决数据合并时行唯一定位的,因为这样的列的值没有什么规律,所以很难对其优化.  
  Top

12 楼fish_yht(百行孝为先,万业勤为径。)回复于 2007-01-01 00:16:21 得分 20

guid固然好哈  
  不过我觉得太长了  
  不容易记忆  
  查询起来也似乎不怎么好  
  基本上不用它的  
  还使用identity的好  
  有必要的时候采用guid  
  比如说数据库里面就着一样东西  
  全局唯一的时候Top

13 楼CrazyFor(冬眠的鼹鼠)回复于 2007-01-01 00:21:42 得分 0

整形的identity占的空间小,索引搜索时也快,Top

14 楼skyclin()回复于 2007-01-02 14:22:30 得分 0

当然GUID有性能有一定的影响!  
  比如做主从式表时,主表的主键是要做为从表的外键。如果主表主键是Identity类型字段就不能返回一个值啊。Top

15 楼skyclin()回复于 2007-01-02 14:22:39 得分 0

当然GUID有性能有一定的影响!  
  比如做主从式表时,主表的主键是要做为从表的外键。如果主表主键是Identity类型字段就不能返回一个值啊。Top

16 楼skyclin()回复于 2007-01-02 14:22:42 得分 0

当然GUID有性能有一定的影响!  
  比如做主从式表时,主表的主键是要做为从表的外键。如果主表主键是Identity类型字段就不能返回一个值啊。Top

17 楼THXK(THXK)回复于 2007-01-04 10:48:07 得分 0

我数据中的每行记录都有GUID,但绝对不会用来做主键,Top

18 楼weiwei6054(踏雪無痕->漂泊雪狼)回复于 2007-01-04 11:21:48 得分 0

尽量用Identity,没有办法采用guid,我们一般用自定义主键Top

19 楼cantops(翡翠梦境里的熊猫人)回复于 2007-01-04 11:46:34 得分 0

是否可以再立一个Identity,但只做索引不做主键呢?Top

20 楼chanfengsr(巉沨散人)回复于 2007-01-04 11:48:34 得分 0

使用GUID作为数据表主键的好处  
     
   
  数据表主健通常采用以下三种方式:    
   
     
   
  1.                   自动递增值。  
   
  2.                   唯一名称。这个是使用自己定义的算法来生成一个唯一序列号。    
   
  3.                   GUID(全局唯一标识符)。  
   
     
   
  GUID与自动递增值及唯一名称比较  
  GUID  
  在客户端生成,由GUID的特性决定,通过GUID生成的值可能出现重复的机会几乎等于零,因此保证在插入表的时候主键值唯一。  
   
  可以方便处理分布式数据的提交,比如:分店数据向总店提交――直接将该部分数据插入即可。  
   
  支持离线数据处理。对本地数据包进行新增记录时即可将该数据表的关键字段值赋值,其处理方法是与在线新增时是一致的。  
   
  自动递增值  
                在数据库服务器端生成,由于该值是由数据库系统内部处理的,亦保证其唯一性,但由于其是在数据库服务器端生成,因此必须将该值返回客户端,客户端通过该值过行其它操作。比如一张单据(主从表)是使用自动递增值,当插入单据抬头后,必须将单据抬头的关键字段值返回,再插入单据明细(单据明细是通过单据抬头关键字段进行关联的)。  
   
  不能很好处理分布式数据的提交,比如:分店数据向总店提交――提交数据时必须重新生成该数据表的关键字段值,以保证该字段值唯一。  
   
  要支持离线数据处理需要进行额外的处理,对本地数据包进行保存记录(保存到本地)时需要插入一个假设唯一值,在提交离线数据回数据服务器时再重新生成真正的唯一值,并重新进行相关的处理。  
   
  唯一名称  
                在客户端生成或在服务端生成,相对于自动递增值不同的地方就是自己维护生成唯一值的算法及所保存的临时值,容易造成出错或其它问题。如果是在客户端生成唯一值的话,还必须保证所生成的值是唯一的。  
   
  不能很好处理分布式数据的提交,比如:分店数据向总店提交――提交数据时必须重新生成(或预先处理)该数据表的关键字段值,以保证该字段值唯一  
   
  要支持离线数据处理需要进行额外的处理,对本地数据包进行保存记录(保存到本地)时需要插入一个假设唯一值,在提交离线数据回数据服务器时再重新生成真正的唯一值,并重新进行相关的处理。  
   
   
  参考:  
  http://dev.csdn.net/article/60/60007.shtmTop

21 楼Lovedog404()回复于 2007-01-04 11:56:56 得分 0

Guid好啊,我一直用它.Top

22 楼runrunrun(农妇、山泉、有点田)回复于 2007-01-04 11:59:12 得分 0

好处大大的。  
  缺点是占用空间多,性能低。  
  在这两者都不是问题的情况下,推荐用之Top

23 楼xthmpro_cn([可人])回复于 2007-01-04 12:12:39 得分 0

反对一刀切,比较傻XTop

24 楼emilchan6k(emilchan)回复于 2007-01-04 12:43:34 得分 0

不涉及数据库之间的合并就不要用,只有涉及到的表才采用,就这么简单Top

25 楼peihexian(知其然.知其所以然)回复于 2007-01-04 12:44:04 得分 10

如果日后有数据同步需求,可以考虑使用guid,这个东西是全球唯一的,但是要考虑到业务数据的唯一性,06年我做过一个项目,access数据汇总到sql   server中,使用到了guid,效果不错,但是遇到一个客户的硬盘损坏,业务数据全部重新录入,这时会产生的guid值和以前上传到sql   server中的guid不一样的情况。Top

26 楼jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)回复于 2007-01-04 13:13:54 得分 0

使用GUID的话一般还要附带一个Datetime类型的字段。Top

27 楼wf5360308(冷月孤峰)回复于 2007-01-04 13:32:34 得分 0

GUID几乎没有用过,一般都是用identity,占用空间很小。Top

28 楼kkk3k3k()回复于 2007-01-04 13:35:00 得分 0

GUID   在并发性上好于identity    
  但是空间引索就不如identity了  
  呵呵Top

29 楼wangtiecheng(不知不为过,不学就是错!)回复于 2007-01-04 13:37:35 得分 0

GUID合并数据方便,但效率、存储空间、可读性堪忧。  
  identity效率较高、空间小,合并数据麻烦些。Top

30 楼zzzl(不拉拉链)回复于 2007-01-04 13:38:55 得分 0

不建议这样做Top

31 楼fox1999(红狐)回复于 2007-01-04 13:42:36 得分 0

看应用了.  
   
  我用   GUID,   因为我是做三层应用,   要处理主从表时,不用先得到主表的ID,   而直接从客户端生成,   一次性提交到服务器就OK了.Top

32 楼marco08(天道酬勤)回复于 2007-01-04 13:43:36 得分 0

個人建議使用identityTop

33 楼happydreamer(www.sz.js.cn,www.gyxk.com)回复于 2007-01-04 13:59:56 得分 0

用guid做主键,主要是程序里面获得方便,identity不易获得,但对索引实在没有什么好处,每次插入不规则的guid,索引维护开销很大Top

34 楼dsj1234(http://www.dianshijin.net/)(http://dianshijin.cn)回复于 2007-01-04 14:32:06 得分 0

顶Top

35 楼99414325ALe(抵制日货)回复于 2007-01-04 14:44:28 得分 0

看应用了.  
   
  我用也是   GUID,   因为我是做三层应用,   要处理主从表时,不用先得到主表的ID,   而直接从客户端生成,   一次性提交到服务器就OK了.  
   
  GUID可以在客户端生成ID,这一点比较好!至于索引个人认为可以另开列!Top

36 楼shine333(enihs)回复于 2007-01-04 15:26:38 得分 0

反对楼上若干星星们关于GUID对索引没有好处的发言。  
   
  大家都混淆了真实的GUID(java里面叫UUID)的概念。GUID并不就是指随机生成码。那个只是类似NewID()函数或者java.util.UUID.randomUUID()返回的128-bit随机数,而这只是GUID/UUID很多种生成方式变种中的一种。  
   
  see   http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt  
   
  我们完全用同时结合id或者其他序列号生成方式、以及系统IP、启动时间等信息的方式,在服务器程序端、甚至数据库端生成一套连续、但是全球唯一的ID,充分利用GUID的优势,进而兼顾将来可能的数据合并,同时又不会引起大的更新索引开销的方式。  
   
  当然,一般的系统还是强烈建议直接使用id。  
   
  =======  
  回复人:fish_yht(百行孝为先,万业勤为径)   (   )   信誉:100 2007-1-1   0:16:21 得分:0  
   
   
   
  guid固然好哈  
  不过我觉得太长了  
  不容易记忆  
  ========  
   
  这个不是用来给人看的,是唯一确定一条记录的Top

37 楼iacpdj(dj)回复于 2007-01-04 15:34:41 得分 0

个人观点  
  1。GUID的最大好处,在分布式数据库作数据合并时不会出现相同值  
  2。由于GUID的长度过大,其实如果作pK的话,可能引起INSERT语句的缓慢  
  Top

38 楼zxkid(如果你有勇气迈出第一步,未来又能糟糕成什么样呢?)回复于 2007-01-04 15:49:18 得分 0

一般用uniqueidentifier字段(.NET中叫Guid结构)  
  在编程时可以省去不少麻烦,用作PK不会重复  
  关于索引,可以加一个Default   GETDATE()的Datetime列即可  
   
  不知各位为什么要用identity列,用作序号?  
  仅仅是为了好记?  
  不知道为Microsoft为什么要提供identity列Top

39 楼tm_zn(心急吃不了热豆腐)回复于 2007-01-04 16:37:13 得分 0

我们项目是用guid做的.插入的时候确实慢!  
  性能和方便性看你取舍了Top

40 楼moonshineidolon(神)回复于 2007-01-04 16:39:16 得分 0

自增长列非常适用于web开发,通过一个数据表中不重复的id就能找到要修改的字段。比用复合主键传值方便。Top

41 楼Ritt(.net虫)回复于 2007-01-04 17:10:02 得分 0

学习Top

42 楼wodxtl()回复于 2007-01-04 17:41:49 得分 0

谁有Gmail     的邀请函,我的邮箱是wodxtl@21cn.comTop

43 楼yuanmu(原木)回复于 2007-01-04 18:09:34 得分 0

分析数据的时候你会后悔的。Top

44 楼yuanmu(原木)回复于 2007-01-04 18:11:06 得分 0

除了没有任何意义的数据,不要用GUIDTop

45 楼move_forward()回复于 2007-01-04 18:22:03 得分 0

不错!   收藏!  
  Top

46 楼zheng616(猪八戒)回复于 2007-01-04 19:24:56 得分 0

数据太大了不用guid用什么?long也有限制呀...int才2亿多..  
  aspDB用的就是这个,看看别人怎么用的..Top

47 楼kaper3()回复于 2007-01-04 20:12:12 得分 0

上海的一个大公司用的也是GUID型的,偶的代码一些参考他的,NND     做主从表对数据的时候眼睛都看花了Top

48 楼nedvedlh(shirley)回复于 2007-01-05 08:23:02 得分 0

学习ingTop

49 楼DanielWYO(爱上小白)回复于 2007-01-05 08:28:23 得分 0

 
  太麻烦了吧,   能不用就不用.    
  integer不好吗?   单独为表加入一个与内容毫无关系的内容,   显然不太值得.    
   
  Top

50 楼leo2003(【健者天行】谁伴我闯荡)回复于 2007-01-05 08:51:19 得分 0

我大部分表都是用   GUID   做主健的。  
   
  很好用。  
  Top

51 楼shine333(enihs)回复于 2007-01-05 09:06:23 得分 0

回复人:DanielWYO(爱上小白)   (   )   信誉:100 2007-1-5   8:28:24 得分:0  
   
   
  ?  
   
  太麻烦了吧,   能不用就不用.    
  integer不好吗?   单独为表加入一个与内容毫无关系的内容,   显然不太值得.  
   
  ==================================  
  正好相反,姑且不论用GUID还是其他什么ID,但是在很多实际情况中,在表中加入一个和业务毫无关系,只是用来唯一确定一条记录的字段,非常值得。  
  Top

52 楼sp4(1)回复于 2007-01-05 09:22:14 得分 0

建议用int,  
  guid一般情况不用,我宁可用时间戳Top

53 楼ZyxIp(绝望中...)回复于 2007-01-05 09:23:35 得分 0

我反正是两个都用,第张表中都有递增的identity和GUID  
   
  GUID在操作时只有在新建数据的时候由程序而不是数据库生成。将SQL提交后通过GUID查出ID。  
  修改,删除,检索,主从表关联时都是用ID做为标识。Top

54 楼DVD_01(OK_008 blog:wghao.cnblogs.com)回复于 2007-01-05 15:49:12 得分 0

学习中,又了解不少知识!  
  Top

55 楼whmjw(明年今日十年之后)回复于 2007-01-05 16:23:08 得分 0

我也用Guid   :)Top

56 楼whmjw(明年今日十年之后)回复于 2007-01-05 16:23:43 得分 0

甚至为了防止重复,Guid后面再加了一个机器名,哧哧Top

57 楼zzzl(不拉拉链)回复于 2007-01-05 18:01:31 得分 0

to   whmjw(明年今日十年之后)    
        不如加上自己的个性签名Top

58 楼happyxuying(婴儿)回复于 2007-01-05 19:19:40 得分 0

jfTop

59 楼ttjacky(豆豆糖)回复于 2007-01-05 22:39:03 得分 0

在有些情况下两个都用,通常在一些基础信息表中可以用GUID和有意义的ID,该ID作为PK,GUID作为备用的,这样用ID和GUID都可以查询Top

60 楼xiaoliangwh(!!!)回复于 2007-01-06 01:14:43 得分 0

帮顶   !Top

61 楼SZ31654270(魔幻天空)回复于 2007-01-06 16:39:33 得分 0

wodxtl@21cn.com,给你发了,请查收~  
  Top

62 楼ziyuan_1016()回复于 2007-01-06 17:00:43 得分 0

长知识,顶Top

63 楼flyaqiao(KiteReport(http://www.kitesoft.cn))回复于 2007-01-06 18:33:08 得分 0

GUID数据导入导出时也很有好处Top

64 楼alicc(狂图)回复于 2007-01-07 15:59:14 得分 0

注意:每张表都必需有个和业务逻辑无关字段作为唯一标识  
   
  采用guid无疑是很不错的  
   
  Top

65 楼skyswan(施望)回复于 2007-03-26 17:41:14 得分 0

都说GUID的索引性能不佳,有没有具体的benchmark说明啊?Top

66 楼zsl5305256(快乐就好!)回复于 2007-03-26 17:48:11 得分 0

guid关联多表的时候速度比用int慢的好多,但是比int好的就是数据的唯一性比较好,要是经常进行数据组合,导入,用guid维护比较好维护!Top

相关问题

关键词

得分解答快速导航

  • 帖主:soaringsouth
  • bugchen888
  • lovcal
  • fish_yht
  • peihexian

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo