sys_guid (), 8i 后提供。

Oracle8i引入了SYS_GUID这个概念,它同Oracle管理员所使用的传统的序列(sequence)相比具有诸多优势。一个序列生成器只是简单地创建从给定的起点开始的一系列整数值,而且它被用在选择陈述式的时候自动地递增该系列。
  
  序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不适合将它用作并行或者远程环境里的主关键字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。
  
  此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则它就不能保证其值是唯一的)。SYS_GUID源自不需要对数据库进行访问的时间戳和机器标识符,这就节省了查询的消耗。
  
  create table use_seq_table(id integer);
  create sequence use_seq_sequence;
  insert into use_seq_table values (use_seq_sequence_value.nextval);
  
  REM - for some reason, the documentation uses raw(32)
  create table use_guid_table(id raw(16));
  insert into use_guid_table(sys_guid());
  
  很多应用程序都依靠序列生成器来创建数据行的主关键字,这些数据行没有一个明显的主值,这也就是说,在这样的数据集里一条记录的创建就会让数据列发生改变。因此,管理员可能会对在表格中将SYS_GUID用作主关键字而不使用序列数感兴趣。这在对象在不同机器的不同数据库里生成以及需要在后来合并到一起的情况下很有用。
  
  但是,SYS_GUID所生成的值是一个16个字节的原始值。序列所生成的整数不会使用16字节(的值),除非它达到了10的30次方(每个字节两个16进制显示位),而且数字是相当独特的:
  
SQL> select dump(123456789012345678901234567890) from dual;
  
DUMP(123456789012345678901234567890)
--------------------------------------------------------------
Typ=2 Len=16: 207,13,35,57,79,91,13,35,57,79,91,13,35,57,79,91
顺便按如下方法说一下RAW类型:
SQL> create table test_raw (raw_col raw(10));
表已创建。
SQL> insert into test_raw values (hextoraw('ff'));
已创建 1 行。
SQL> insert into test_raw values (hextoraw('0'));
已创建 1 行。
SQL> insert into test_raw values (hextoraw('23fc'));
已创建 1 行。
SQL> insert into test_raw values (hextoraw('fffffffffff'));
已创建 1 行。
SQL> insert into test_raw values (hextoraw('ffffffffffffffffffff'));
已创建 1 行。
SQL> insert into test_raw values (utl_raw.cast_to_raw('051'));
已创建 1 行。
SQL> select raw_col, dump(raw_col, 16) dump_raw from test_raw;
RAW_COL DUMP_RAW
-------------------- -----------------------------------------------
FF Typ=23 Len=1: ff
00 Typ=23 Len=1: 0
23FC Typ=23 Len=2: 23,fc
0FFFFFFFFFFF Typ=23 Len=6: f,ff,ff,ff,ff,ff
FFFFFFFFFFFFFFFFFFFF Typ=23 Len=10: ff,ff,ff,ff,ff,ff,ff,ff,ff,ff
303531 Typ=23 Len=3: 30,35,31
已选择6行。
  RAW类型的存储很简单,如上面DUMP出来的一样,对应关系很清楚。当使用HEXTORAW时,会把字符串中数据当作16进制数。而使用UTL_RAW.CAST_TO_RAW时,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中。如下所述:
SQL> insert into test_raw values (hextoraw('gg'));
insert into test_raw values (hextoraw('gg'))
*
ERROR 位于第 1 行:
ORA-01465: 无效的十六进制数字
 
SQL> insert into test_raw values (utl_raw.cast_to_raw('gg'));
已创建 1 行。
  可以看到前面说的,hextoraw是“16进制所见为所得”,而 utl_raw.cast_to_raw 是“ASCII码直存”。

  再顺着上面关于SYS_GUID的用法。
较短的值就意味着用于表格和索引的存储空间更少,以及查询访问的时间更短。
  
  使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上的消耗;问题就是在哪里。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。对序列而言,性能上的影响在查询期间,在这个时候,SGA序列的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被丢失。
  
  SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为Web参数来传递。
  
  出于这些原因,将SYS_GUID作为一个主关键字不是一个很好主意,除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。
不过,使用SYS_GUID来做主键也不是不可以,但需要先转为 varchar2 较好。最好在使用时显示转换一下,直接使用RAW显然是不合适的。
例如使用时可以这样引用: substr(sys_guid, 1, 32), 这样显示转换一下下。直接插 raw 进入 varchar2 字段,发生隐式的转换,总不是太妥。曾见过因为大量隐式转换导致最后数据库崩溃,当然事后看是数据库的bug了。

转载于:https://blog.51cto.com/77857/179907

sys_guid 点滴用法相关推荐

  1. [转载红鱼儿]kbmmw 开发点滴:TkbmMWLock用法

    TStringList不是线程安全的,当我们在线程用到他是,要做保护.方法有两种,一种是用delphi自带的Critical,另外一种就是kbmMW为我们提供的TkbmMWLock类. 现在我们看看如 ...

  2. wstring 用法点滴

    wstring 常见的用法: 1.赋值 assign() (1)用一个字符串给另一个字符串直接赋值 str2.assign(str1); 当然也可以 str2 = str1; (2)将一个字符串的子串 ...

  3. [转载红鱼儿]kbmmw 开发点滴:ErrorTable用法

    TkbmMWClientQuery有一个ErrorTable属性,用于记录提交Query时返回的错误结果.当用户保存修改的业务数据,出错时,可以用ErrorTable定位出错的记录并提示错误信息. 下 ...

  4. mysql group_concat去重_sql点滴45—mysql中group_concat用法-阿里云开发者社区

    group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果. 比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组 ...

  5. 博士生创新能力的培养点滴

    创新能力的培养是博士生教育的核心,博士生的学位论文必须有所创新.下面是我在攻读学位期间和毕业后工作中就创新能力培养的一些体会. 一.导师起着关键作用 博士导师对博士生创新能力的培养起着十分重要的作用. ...

  6. scikit-learn点滴

    scikit-learn点滴 scikit-learn是非常漂亮的一个机器学习库,在某些时候,使用这些库能够大量的节省你的时间,至少,我们用Python,应该是很难写出速度快如斯的代码的. sciki ...

  7. vb FindwindowEx的用法实例

    '添加 Command1 Const WS_CHILD = &H40000000 Const WM_LBUTTONDOWN = &H201 Const WM_LBUTTONUP = & ...

  8. Vc控件用法总结之List Control

    1.新建对话框MFC,在对话框上放一个ListCtrl ID:IDC_PATH View:Report 2.为ListCtrl添加变量 右击->添加变量m_wndPath 3.找到OnInitD ...

  9. 搜索引擎lucene点滴

    搜索引擎lucene点滴 在项目中有用到搜索引擎lucene.现将学到的lucene中的一些知识点和用法的做了下总结,希望能够对大家有所帮助. 本项目中的lucene使用概述:在Portal项目中lu ...

最新文章

  1. 人工智能应用需要高可信性(180806)
  2. 第十一届河南省赛--A计划日
  3. Unicorn - W3C 统一验证工具
  4. 数据可视化分析票房数据报告_票房收入分析和可视化
  5. PhalApi:[3.1] 扩展类库:微信开发
  6. 迈达斯cdn安装_CDN安装
  7. 电脑技巧:Win10电脑卡顿解决小技巧,非常实用
  8. 如何卸载deepfreeze(冰点还原)
  9. 网站做SEO优化的5个理由
  10. 计算机无法打开压缩包,压缩包损坏或压缩格式未知且无法打开
  11. 旷视研究院「技术圆桌派-上海专场 」报名启动!
  12. 北京:租房合同需网签!电子签名助力合规
  13. (SEED-Lab) Sniffing_Spoofing
  14. Apache的Order Allow,Deny 详解
  15. fanuc机器人DCS
  16. 爬取7160网站总是不成功。。。求大神分析分析
  17. 2022考研日语71分自学经验贴;日语可以自学吗?
  18. 未来架构师的平台战略范例(4)_大数据
  19. Effective C++ More Effective C++(四)
  20. 优酷路由宝刷梅林_优酷路由宝 YK-L1c 和 YK-L1 刷入 Breed 不死和 hiboy Padavan 固件...

热门文章

  1. C#网页数据采集(三)HttpWebRequest
  2. mac 下 mamp 配置虚拟主机步骤
  3. 关于Office 365 域名绑定问题
  4. DFS Gym 100553J Jokewithpermutation
  5. linux下修复bash漏洞
  6. 设计模式(十五):Iterator迭代器模式 -- 行为型模式
  7. eBay是如何进行大数据集元数据发现的
  8. JS在浏览器中的执行机制
  9. 预测 “疯狂三月” 冠军的办法,我只告诉你!
  10. Js下载文件到本地(兼容多浏览器)