ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 18494|回复: 34

[讨论] 【大话IT】ORACLE的PK之间的PK(sequence vs guid)

[复制链接]
认证徽章
论坛徽章:
168
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2017-4-14 14:27 | 显示全部楼层 |阅读模式
获奖公布:
精彩回复:东风玖哥   renxiao2003   pure_lotus   jimn1982   oracle_cj
请以上获奖人员在5月25日前将姓名、电话、邮箱、公司、职务、快递地址站短给hyukhae079408,以便尽快给大家发放礼品。


话题背景:
          Oracle8i引入了SYS_GUID这个概念,系统根据当前时间和机器码,生成全球唯一的一个序列号。它同经常使用的传统的序列(sequence)相比具有诸多优势。

          声称一个序列生成器只是简单地创建从给定的起点开始的一系列整数值,而且它被用在选择陈述式的时候自动地递增该系列。

      序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不适合将它用作并行或者远程环境里的主关键字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。

     此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则它就不能保证其值是唯一的)。SYS_GUID源自不需要对数据库进行访问的时间戳和机器标识符,这就节省了查询的消耗。
      
       现例: 笔者在设计公司员工表时先启用了sys_guid,后来由于要与传统的系统对接(目前只认number型字段),又经过大的变动更改为了序列。在他人看来,1.sys_guid的32位长度过长,浪费存储。2.sys_guid不好记,在进行一些运维时,不及number型主键好记,number主键甚至可以有靓号的作用。
               
      当然还有些情况的主键是通过自定义函数的方式,生成的带有一定业务意义又能作唯一标识的字符串。
   
话题讨论:
              1.目前大家在工作中运用的是何种方式生成的主键,原因是什么?
              2.针对上面提到的几种方式,各有什么好处或者劣势。
              3.特殊情况下的主键生成(自定义方式),这是一种怎样特殊的场景,都是怎么实现的。
         
注:讨论不限于此,可引申发散。


活动时间:2017年4月14日--5月14日

活动奖励:
动结束后,我们将会选取5个精彩回复,送创意镜头水杯一个。





DTCC 2017 来啦!

随着云计算和大数据时代的来临,数据正在以前所未有的速度成为各个领域价值创造的核心驱动力。

在此背景下,国内最受关注的数据库技术盛会——2017第八届中国数据库技术大会(DTCC2017)将于2017年5月11-13日如约而至。本届大会以“数据驱动•价值发现”为主题,汇集来自互联网、电子商务、金融、电信、政府、行业协会等20多个领域的120多位技术专家,共同探讨Oracle、MySQL、NoSQL、云端数据库、智能数据平台、区块链、数据可视化、深度学习等领域的前瞻性热点话题与技术。大会共设定2大主场和20个技术专场,将吸引5000多名IT人士参会,为数据库人群、大数据从业人员、广大互联网人士及行业相关人士提供最具价值的交流平台。





官网链接:http://dtcc.it168.com/
购票链接:http://dtcc.it168.com/goupiao.html

欢迎扫码关注DTCC官方微信,获取最新信息!

求职 : SAP实施
认证徽章
论坛徽章:
267
巴塞罗那
日期:2016-01-29 16:40:32巴塞罗那
日期:2016-01-29 16:40:32巴塞罗那
日期:2016-01-29 16:40:32巴塞罗那
日期:2016-01-29 16:40:32巴塞罗那
日期:2016-01-29 16:40:32芝加哥公牛
日期:2017-02-07 09:03:42芝加哥公牛
日期:2017-02-07 09:03:43芝加哥公牛
日期:2017-02-07 09:03:43芝加哥公牛
日期:2017-02-07 09:03:43芝加哥公牛
日期:2017-02-07 09:03:43
发表于 2017-4-14 15:16 | 显示全部楼层
就等我的话题了

使用道具 举报

回复
论坛徽章:
263
乌索普
日期:2016-07-29 01:46:29射手座
日期:2016-05-26 14:02:50双子座
日期:2016-05-25 16:05:44白羊座
日期:2016-05-23 11:49:19双鱼座
日期:2016-04-29 17:13:05秀才
日期:2016-04-29 15:03:39秀才
日期:2016-04-29 15:04:10技术图书徽章
日期:2016-04-29 15:04:10秀才
日期:2016-03-28 10:21:13巨蟹座
日期:2016-03-26 21:14:25
发表于 2017-4-14 15:26 | 显示全部楼层
大部分用SEQUENCE, 少数用SYS_GUID

另外,你的“创意镜头水杯”长得很像飞机杯  

使用道具 举报

回复
论坛徽章:
3
ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
发表于 2017-4-14 16:04 | 显示全部楼层
1.目前大家在工作中运用的是何种方式生成的主键,原因是什么?
    基本上使用sequence和自定义主键方式居多,原因是
   1)有的应用需要生成有逻辑意义的序号,guid没有用武之地
   2)应用没有使用分布式计算环境,没有全局唯一性的需求。

2.针对上面提到的几种方式,各有什么好处或者劣势。
sequence:
    优点--使用最简单,建个序列get就好
    缺点--数据库实现不同(informix和Oracle就存在差异,MySQL根本就不支持)影响数据迁移,不支持分布式计算环境(多个数据库会冲突)
guid:
    优点--完美支持分布式计算环境,全局唯一
    缺点--实现方式选择太多(应用层代码生成、数据库原生功能生成)需要根据应用场景选择合适的,生成时的开销比较大
自定义主键:
    优点--可以根据需求实现任意格式的主键
    缺点--需要编写代码或者调用第三方库函数或调用数据库函数生成,生成时效率不如sequence

3.特殊情况下的主键生成(自定义方式),这是一种怎样特殊的场景,都是怎么实现的。
比如项目管理系统中需要通过项目编号识别项目性质,形如YYYY-TT-SSSS的主键,YYYY是项目年份,TT是项目类型,SSSS是项目序号每年从1开始顺序增加。通过应用代码实现,SSSS取自数据库sequence,年份和项目类型来自输入参数。

使用道具 举报

回复
求职 : 信息技术经理/主管
认证徽章
论坛徽章:
579
NBA季后赛纪念徽章
日期:2012-06-25 12:19:11洛杉矶快船
日期:2014-06-16 11:45:27NBA常规赛纪念章
日期:2013-04-22 11:49:35NBA季后赛纪念徽章
日期:2011-06-13 11:34:51NBA常规赛纪念章
日期:2011-04-15 13:34:11NBA季后赛纪念徽章
日期:2013-06-21 14:52:05NBA常规赛纪念章
日期:2012-04-27 16:07:05芝加哥公牛
日期:2015-06-25 09:32:08丹佛掘金
日期:2015-04-17 15:58:09尤他爵士
日期:2015-04-17 15:58:09
发表于 2017-4-14 16:59 | 显示全部楼层
  1.目前大家在工作中运用的是何种方式生成的主键,原因是什么?
只用sequence,没有那么长,有逻辑意义
              2.针对上面提到的几种方式,各有什么好处或者劣势。
sequence:简单
guid:全球唯一用不到
              3.特殊情况下的主键生成(自定义方式),这是一种怎样特殊的场景,都是怎么实现的。
如wms条码唯一等。

使用道具 举报

回复
认证徽章
论坛徽章:
160
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB社区12周年站庆徽章
日期:2013-08-13 16:52:38itpub13周年纪念徽章
日期:2014-10-08 15:21:35ITPUB14周年纪念章
日期:2015-10-26 17:23:44蒙奇·D·路飞
日期:2017-03-29 10:45:082017金鸡报晓
日期:2017-01-10 15:33:11状元
日期:2015-11-19 12:58:23榜眼
日期:2015-11-19 12:58:23探花
日期:2015-11-19 12:58:23
发表于 2017-4-15 20:41 | 显示全部楼层
必须SEQUENCE啊
当然也有用当前日(yyyymmdd)+seq的,e.g. 201704150001,201704150002...

使用道具 举报

回复
认证徽章
论坛徽章:
89
举人
日期:2015-11-09 11:35:06秀才
日期:2017-09-18 17:02:592017金鸡报晓
日期:2017-02-08 14:09:13秀才
日期:2016-12-21 16:55:07ITPUB15周年纪念
日期:2016-10-06 10:54:102017金鸡报晓
日期:2017-01-10 15:39:052016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:30秀才
日期:2016-02-18 09:19:48秀才
日期:2016-02-18 09:11:33
发表于 2017-4-15 22:14 | 显示全部楼层
支持 罗大耳朵版主

使用道具 举报

回复
论坛徽章:
1
ITPUB14周年纪念章
日期:2015-10-26 17:24:11
发表于 2017-4-15 23:17 | 显示全部楼层
1.目前大家在工作中运用的是何种方式生成的主键,原因是什么?目前数据库的主键很多使用的是有实际意义的字段
对于无法确认字段唯一性的很多数据表,选择性的使用了年月日+短序列的构成。
很少会很使用到guid, 效率不够,非分布式系统用不到。


2.针对上面提到的几种方式,各有什么好处或者劣势。
a,使用有意义的字段效果是符合业务实际需求
B,短序列+日期, 可能出现某一天不顺序的问题,一般处理为定期日终系统维护是变更

3.特殊情况下的主键生成(自定义方式),这是一种怎样特殊的场景,都是怎么实现的。
日期+序列

使用道具 举报

回复
论坛徽章:
60
林肯
日期:2013-09-12 15:57:33路虎
日期:2014-01-26 14:35:49马自达
日期:2013-10-11 13:52:31三菱
日期:2013-11-25 11:21:19现代
日期:2013-08-29 14:39:50雪佛兰
日期:2013-09-12 15:55:00一汽
日期:2013-11-28 14:15:05技术图书徽章
日期:2013-12-11 10:11:35技术图书徽章
日期:2013-12-11 10:10:51技术图书徽章
日期:2014-01-14 10:54:13
发表于 2017-4-17 07:57 | 显示全部楼层
本帖最后由 pastime_Wang 于 2017-5-13 18:07 编辑

我来谈谈一些在 SqlServer 和 ETL设计中相关的经验和体会:

1.目前大家在工作中运用的是何种方式生成的主键,原因是什么?

根据具体的业务需求和数据库设计, 主键可分为"自动"和"手动"2种增长方式生成.
手动方式主键列的数据类型可以控制,不会重复.但是维护成本高,生成键值需要自行编写存储过程来产生,网络开销大,运行时还要考虑到并发冲突等.  所以大家比较喜欢选则自动增长类型:

  1. IDENTITY ,  数据类型 INT, 4字节
  2. Sequence, 在MS2012 版本中支持,基本上与oracle 功能类似,Catch & Cycle 特性都有.
  3. GUID,   直接调用函数 newid(),数据类型 uniqueidentifier, 16字节

---------------------------------------------------------------------
2.针对上面提到的几种方式,各有什么好处或者劣势。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
优点
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IDENTITY
   "简单粗暴", 支持bigint.保证在一次提交事务中序号"连续". 主键索引性能好;
   后生成的值比之前生成的值都大,因此新插入的数据会简单地追加在表的尾部。对于频繁插入新数据的表来说,Identify主键的性能要好一些;
   这一特性在ETL"增量"抽取过程中非常有用, 只要大于MAX(ID)就能直接得到增量数据。


Sequence
   不像IDENTITY 列属性有那么多限制(比如 IDENTITY 属性只能应用在某个表的某一列, 无法跨表操作, 无法循环使用。 Truncate 会重置 IDENTITY值 )

GUID
   便于对某些对象或常量进行永久标识,如类的 ClassID,对象的实例标识,UDDI 中的联系人、服务接口、tModel标识定义等。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
缺点:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IDENTITY
   数据迁移不太方便,需要手动暂停和恢复Identity (SET IDENTITY_INSERT <table_name> ON /OFF);
   多个数据库间进行数据的复制时(SQL Server的数据分发、订阅机制允许我们进行库间的数据复制操作),自动增长型字段可能造成数据合并时的主键冲突;

Sequence
   Sequence插入表中的序列号可以被Update,除非通过触发器来进行保护
   Sequence有可能插入"重复值"(对于循环SequenceNumber来说)
   Sequence仅仅负责产生序列号,并不负责控制如何使用序列号,因此当生成一个序列号被Rollback之后,Sequence会继续生成下一个号,从而在序列号之间产生"间隙"。

GUID
   随机、无顺序的,所以使用时要注意场合,最好不要尝试用它来作为电子邮件地址;
   无序GUID作为主键以及作为聚集索引带来"空间的浪费"以及由此带来的读写效率的下降; "存储的碎片化"(fragmentation)带来的读写效率严重下降。
---------------------------------------------------------------------
3.特殊情况下的主键生成(自定义方式),这是一种怎样特殊的场景,都是怎么实现的。

自定义方式主要根据业务需要。 生成键值往往需要自行编写"存储过程"来产生,网络开销大,运行时还要考虑到并发冲突等.
比如:订单号的生成:编码+客户代码+时间戳. 设计成一个固定长度的字符串,保证每个字段都是有意义的。发现问题可以及时地定位和搜索。 要找**客户在5/12日的订单等等.



使用道具 举报

回复
认证徽章
论坛徽章:
8
秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-28 15:11:09秀才
日期:2017-03-28 15:59:38秀才
日期:2017-04-06 18:09:28秀才
日期:2017-07-11 13:54:02秀才
日期:2017-08-18 11:06:45秀才
日期:2017-09-18 17:00:37秀才
日期:2017-09-18 17:33:51
发表于 2017-4-17 14:38 | 显示全部楼层
1.目前大家在工作中运用的是何种方式生成的主键,原因是什么?
我目前用SEQUENCE,因为我尽量用默认的东西

2.针对上面提到的几种方式,各有什么好处或者劣势。
SEQUENCE:
    优点:默认做法,使用简便
    缺点:影响数据迁移,不支持分布式计算环境(多个数据库会冲突)
SYS_GUID:
    优点:完美支持分布式计算环境,全局唯一
    缺点:生成时消耗资源多
自定义主键:
    优点:可以根据需求实现任意格式的主键
    缺点:需要自己编写代码或者调用第三方库函数生成,生成时效率低,并且无法保证唯一性

3.特殊情况下的主键生成(自定义方式),这是一种怎样特殊的场景,都是怎么实现的。
如果让我自定义主键,我就用模块名+时间戳的方式生成

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表