`
- 浏览:
195400 次
- 性别:
- 来自:
天津
-
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了。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
需要在 Oracle GoldenGate 中配置表,以便使用 SYS_GUID 列来唯一标识行。 3. 参考文献 本文档中使用的软件组件: * Oracle Database 10.2 或更高版本 * Oracle GoldenGate 10.4 或更高版本 附录 A: 示例表配置 ...
方差是衡量数据分散程度的一种方法,其值越大表示数据点离散程度越高。 #### 第二章 字符函数 字符函数主要用于处理文本数据,包括字符串的创建、修改、提取等操作。这些函数在进行数据清洗和格式化时非常重要。 ...
2. **易于实现**:大多数现代数据库管理系统都提供了内置的支持,如上述的`NEWID()`和`SYS_GUID()`函数,使得UUID的生成变得简单且高效。 3. **独立于平台**:UUID的生成算法是标准的,可以在不同的平台和编程语言...
GUID(全局唯一标识符)在许多场景下都是必不可少的,Oracle提供了内置函数`SYS_GUID()`来生成GUID。 ```sql SELECT SYS_GUID() FROM DUAL; ``` 但是,此函数生成的GUID格式并不带连字符,如果需要更标准的GUID...
除了使用序列实现自增主键外,Oracle还提供了其他几种主键生成策略,比如使用`SYS_GUID()`函数生成全局唯一标识符(GUID)作为主键。这种方法适用于需要全局唯一性的场景,但可能不适合对性能要求较高的应用,因为`...
在Oracle中,可以通过使用`SYS_GUID()`或`DBMS_RANDOM`包来实现随机排序,从而达到随机抽样的目的。例如: ```sql SELECT * FROM (SELECT * FROM TB_PHONE_NO ORDER BY SYS_GUID()) WHERE ROWNUM ; ``` 此语句将从`...
1. 使用`SYS_GUID()`函数: ```sql SELECT * FROM ( SELECT * FROM TABLENAME ORDER BY SYS_GUID() ) WHERE ROWNUM ; ``` 2. 使用`DBMS_RANDOM.VALUE`函数: ```sql SELECT * FROM ( SELECT * FROM ...
- **系统函数**:如 `USER`, `SYS_GUID`, `CURRENT_TIMESTAMP` 等。 #### 2. 具体函数示例及用法 - **字符串连接函数 CONCAT** - **功能**:用于将两个字符串连接成一个字符串。 - **语法**:`CONCAT(string1, ...
1. id:VARCHAR2类型,表示日志的唯一标识符,通过SYS_GUID()函数生成,设置为主键。 2. visitTime:timestamp类型,记录访问发生的时间。 3. username:VARCHAR2类型,记录发起请求的用户的用户名。 4. ip:VARCHAR...
标题中的“XP系统SP2 disk.sys”指的是在Windows XP Service Pack 2环境下遇到的一个与`disk.sys`驱动程序相关的问题。`disk.sys`是Windows操作系统中的一个关键驱动,它负责处理磁盘I/O(输入/输出)操作,包括对...
AND PRIOR sys_guid() IS NOT NULL; -- 使用自定义函数 CREATE OR REPLACE FUNCTION split_category(p_categories VARCHAR2) RETURN SYS_REFCURSOR AS v_rc SYS_REFCURSOR; BEGIN OPEN v_rc FOR WITH cte AS ( ...
通过使用`sys_guid()`函数来获取一个GUID,然后将其转换为十六进制字符串,并进行格式化处理,以符合标准UUID格式。 - **MySQL中的UUID生成函数**: ```sql select replace(uuid(), '-', ''); ``` MySQL提供了...
### 安全模式卡在disk.sys的解决方法详解 #### 一、问题概述 当用户在尝试预装Windows 8或从Linux系统改装为Windows 7时,可能会遇到计算机卡在“正在启动Windows”界面或者在安全模式下卡在加载`disk.sys`的情况。...
这种策略维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 foreign foreign是一种使用另外一个相关联的对象的主键的策略。这种策略通常和联合起来使用。 guid guid是一种采用数据库底层的guid算法...
V_ID := SYS_GUID(); LOOKUP(RECORDS(I).ID) := V_ID; -- 生成新ID并存入LOOKUP RECORDS(I).ID := V_ID; IF RECORDS(I).NAME <> 'ROOT' THEN RECORDS(I).PARENT_ID := LOOKUP(RECORDS(I).PARENT_ID); END IF; ...
根据给定的部分内容,我们可以看到一种典型的建库方法: ```sql IF EXISTS(SELECT * FROM sys.sysdatabases WHERE name = 'wf') BEGIN USE master DROP DATABASE wf END GO CREATE DATABASE wf ON (NAME = N'wf',...
- **CommonUtil.getSalt(guid)**:根据GUID生成密钥和初始化向量。 - **EncryptUser(userName, intro, apply)**:使用DES算法加密用户名生成票据。 - **DecryptUser(tokon, intro, apply)**:使用DES算法解密票据...
然后在`GetSystemFolder`子程序中,我们填充了`GUID`结构的值,调用`SHGetKnownFolderPath`函数并存储返回的路径到`sysPath`变量。最后,根据函数调用的结果,我们通过消息框显示系统文件夹路径或者错误信息。 在...
订单、报价单类型的子表明细表操作,支持GUID插入; 导入、导出、打印、加密等方法; 公共字典、XML字典使用; 多种打印、导入导出、图表支持,日志记录等。 用户可以在此基础上几天之内完成快速开发企业实用的系统,...