SYS_GUID
SYS_GUID同Oracle管理员所利用的传统的序列(sequence)比较具有诸多上风。一个序列天生器只是大略地创建从给定的出发点开始的一系列整数值,而且它被用在选择陈述式的时候自动地递增该系列。
序列天生器所天生的数字只能担保在单个实例里是唯一的,这就不适宜将它用作并行或者远程环境里的主关键字,由于各自环境里的序列可能会天生相同的数字,从而导致冲突的发生。SYS_GUID会担保它创建的标识符在每个数据库 里都是唯一的。
此外,序列必须是DML陈述式的一部分,因此它须要一个到数据库的来回过程(否则它就不能担保其值是唯一的)。SYS_GUID源自不须要对数据库进行访问的韶光戳和机器标识符,这就节省了查询的花费。

SYS_GUID() 天生32位的唯一编码。来天生唯一主键
例如:
create table test(id raw(16) default sys_guid() primary key,name varchar2(100));insert into test values(sys_guid(),'t1');
这样就能天生唯一的主键id了,插入数据时不用插入id列。
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 ); create table use_guid_table(id raw (16));insert into use_guid_table(sys_guid());
很多运用程序都依赖序列天生器来创建数据行的主关键字,这些数据行没有一个明显的主值,这也便是说,在这样的数据集里一条记录的创建就会让数据列发生改变。因此,管理员可能会对在表格中将SYS_GUID用作主关键字而不该用序列数感兴趣。这在工具在不同机器的不同数据库里天生以及须要在后来合并到一起的情形下很有用。
但是,SYS_GUID所天生的值是一个16位的原始值。序列所天生的整数不会利用16位(的值),除非它达到了10的30次方(每个字节有两位),而且数字是相称独特的:
SQL> select dump (123456789012345678901234567890) from dual ;
较短的值就意味着用于表格和索引的存储空间更少,以及调查的韶光更短。
利用SYS_GUID或者序列会在数据库利用周期里的某些地方造成性能上的花费,对付SYS_GUID而言,性能上的影响在查询韶光和 创建韶光上(在表格里要创建更多的块和索引以容纳数据)。对序列而言,性能上的影响在查询期间,在这个时候,SGA序列的缓冲区被用光。在缺省情形下,一 个序列一次会缓冲20个值。如果数据库没有利用这些值就关闭了,它们就会被丢失。
SYS_GUID天生的值的另一个显著的不敷之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来添补它们,或者将它们作为Web参数来通报。
出于这些缘故原由,将SYS_GUID作为一个主关键字不是一个很好主张,除非是在一个并行的环境里或者希望避免利用管理序列天生器的情形下。
总结
比较于JAVA的uuid,SYS_GUID优点便是天生的字符串是唯一的,但其和UUID有同样的弊端:天生的序列过长并且没有规律未便利影象。SYS_GUID的运用处景是在于:当数据库某字段设置为唯一,则可用次天生(比如主键)
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~