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了。
RePost:http://www.cublog.cn/u/2996/showart_447610.html
相关推荐
在C#中,生成`Guid`最简单的方式是通过`Guid.NewGuid()`方法,它使用内置的算法生成一个全新的、独一无二的`Guid`。然而,`Guid`的生成算法可以分为多个版本,如V1到V5,每种版本在生成策略上略有不同,例如V1基于...
GUID,全称Globally Unique Identifier,是一种在大量分布式系统中确保每个对象具有独特标识的方法。在软件开发中,特别是在.NET框架或Windows操作系统中,GUID常用于创建唯一的类实例、数据库记录、文件名等。 ...
- **唯一性**:虽然GUID理论上非常独特,但在极端情况下(如时间同步问题或使用相同的随机数源),可能会出现冲突。因此,需要测试并在生产环境监控其行为。 - **格式化**:函数可能返回的是标准的32字符的GUID,...
1C公司是一家专注于开发企业级软件的俄罗斯公司,其产品常常使用GUID来唯一标识各种对象。 在IT领域,GUID是微软Windows操作系统中广泛使用的一种标识符,它在全球范围内是唯一的,由128位数字组成,通常以32个十六...
标题中的"GUID Generator.rar_generator_guid_tool"表明这是一个用于生成全局唯一标识符(GUID)的工具。GUID,全称Global Unique Identifier,是...对于需要使用GUID的开发者或者系统管理员,这样的工具是非常实用的。
需要在 Oracle GoldenGate 中配置表,以便使用 SYS_GUID 列来唯一标识行。 3. 参考文献 本文档中使用的软件组件: * Oracle Database 10.2 或更高版本 * Oracle GoldenGate 10.4 或更高版本 附录 A: 示例表配置 ...
Django GUID(Global Unique Identifier)库,正如其名,提供了一种在Django项目中生成全局唯一标识符(GUID)的方法。在数据库操作中,尤其是在分布式系统中,GUID经常被用来确保每个记录的唯一性,避免冲突。该库...
标题“vs2019_GUID生成工具.rar”指的是一个压缩包,其中包含了在Visual Studio 2019环境下使用的GUID生成工具。GUID,全局唯一标识符(Globally Unique Identifier),在软件开发中扮演着重要角色,特别是在创建COM...
标题"PDIUSBD12.rar_PDIUSBD12 USB_USB SCH_d12_guid829_usb d12"指的是一个关于PDIUSBD12 USB设备的资源包,其中包含了该设备的相关固件(firmware)、软件以及电路设计图纸(schematic)。这个设备是基于Philips...
全局唯一标识符(GUID,Globally Unique Identifier)是一种在信息技术领域中广泛使用的标识符,特别是在软件开发、数据库设计和网络编程中。GUID是由128位数字组成的,通常以32位十六进制的形式表示,例如:`{...
This is a Visual Basic 6 project that creates a GUID. It contains the function "CreateGUIDStr()". This function returns a GUID. The function calls some APIs, but this work is hidden from the user. ...
MySQL中的GUID(Globally Unique Identifier)主键生成方式是一种确保数据库中每一条记录具有唯一标识的方法,尤其在分布式系统中十分常见。本示例主要介绍如何通过Hibernate框架配置,来实现MySQL数据库中GUID主键...
文档涵盖了JBPM的基础概念、使用方法以及高级特性等内容。 #### 二、JBPM的关键组件 ##### 1. jPDL Suite jPDL(Java Process Definition Language)是JBPM早期版本中使用的一种过程定义语言。尽管JBPM 5.0及以后...
在C#中,可以使用Bitmap对象来表示图像,并通过GetPixel和SetPixel方法获取和设置像素颜色。黑白效果通常通过将每个像素的RGB值转换为其灰度值实现,而柔化处理则可能涉及到模糊算法,如高斯模糊。 4. 高斯模糊:...
标题和描述提及了“netcore_guid3.1.pdf”,文档的标题暗示了文档是一个关于.NET Core 3.1的指导手册或指南。.NET Core 3.1是一个广泛使用的开源、跨平台的.NET实现,用于创建现代网络应用、云服务以及其他应用程序...
- **连接命令**: 使用`conn[ect] sys/orcl@orcl as sysdba`进行连接。 - **断开连接**: 输入`disc[onnect]`命令来断开当前的连接。 - **修改密码**: 使用`psssw[ord]`命令来更改密码。 - **显示用户**: 输入`show ...
标题中的"driver_Source.rar_guid829"暗示了这是一个与驱动程序源代码相关的压缩包,可能包含一个特定的示例项目或教程,其中"guid829"可能是该资源的唯一标识符或者是某个特定版本的标记。描述指出是"D12 DDK 的...
芯片后端综合流程工具DC 的uer guid、布局布线 ICC uer guid。 包含综合布局布线 基本流程、优化手段。也可以作为命令查询手册,包含基本tcl命令。做综合、ICC 等后端人员必备手册
在介绍这个方法之前,首先需要理解UUID和GUID的概念以及它们的应用场景。 UUID(Universally Unique Identifier)是一种标准化的128位长度的全局唯一标识符,它可以保证在同一时间和空间范围内的所有生成的UUID都是...