概述
oracle8i之后,提供了一个生成不重复数据的函数sys_guid(),总共32位。 生成的依据主要是时间和机器码,全球唯一,类似于java中的UUID(都是全球唯一的)。
SYS_GUID
SYS_GUID 与 Oracle 管理员使用的传统序列相比有很多优势。 序列生成器简单地创建一个从给定起点开始的整数值序列,它用于在选择语句时自动递增序列。
sequence generator生成的number只能保证在单个instance内唯一,不适合在parallel或者remote环境中作为primary key使用,因为sequence在各个环境中可能生成相同的number,从而导致冲突。 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或者sequence会在数据库生命周期的某些地方造成性能消耗。 对于 SYS_GUID,性能影响是查询时间和创建时间(在表中创建更多块和索引以容纳数据)。 对于序列,性能影响发生在查询期间,此时 SGA 序列的缓冲区已用完。 默认情况下,一个序列一次缓冲20个值。 如果数据库在没有使用这些值的情况下关闭oracle修改字段名,它们将会丢失。
SYS_GUID 生成的值的另一个显着缺点是管理它们变得更加困难。 您必须(手动)输入它们或通过脚本填充它们,或将它们作为 Web 参数传递。
由于这些原因,将 SYS_GUID 用作主键并不是一个好主意,除非在并行环境中或者如果您想避免使用管理序列生成器。
总结
与JAVA的uuid相比,SYS_GUID的优点是生成的字符串是唯一的,但也有与UUID相同的缺点:生成的序列太长且不规则,不方便记忆。 SYS_GUID的应用场景是:当数据库中的某个字段设置为唯一时,可以生成二级(如主键)
更多devops和DBA内容稍后会分享oracle修改字段名,感兴趣的朋友可以关注~