ORACLE的GUID主键生成
来源:互联网 发布:国资委快报软件下载 编辑:程序博客网 时间:2024/05/29 11:00
项目中若采用oracle数据库,则主键生成可以有两种方式,一是用sys_guid(),二是定义一个sequence,然后用nextval得到ID。
Oracle的定义sequence例子:
create sequence seq_test
minvalue 10000
maxvalue 99999999999999999
start with 20000
increment by 1
cache 20
cycle
order;
从网络搜索得到的结论看,一般的意见总结为:
1.SYS_GUID()比sequence复杂;
2.SYS_GUID做主键,则表、索引存储开销多;
3.SYS_GUID索引查询比sequence慢;
但实际上,若每天5万条记录,则一年365*50000=18250000条记录,则理论上需要多耗费空间约合 1.46 GB 存储空间.显然,这些空间对当前的服务器的内存系统而言,影响并不大(按月分区), 就磁盘消耗而言都是微不足道的.
查询的时候用guid和sequence执行计划也是差不多的,也就是查询效率并不一定差。
从实践来看,使用SYS_GUID()做主键的优点多于负面影响。特别是在多个数据库数据集成时,GUID的优点显而易见。而关系数据库设计的法则约定:“主键不要代表任何意义”,更何况开发商既然提供这个功能而且一直在用,所以它的存在自有它的可取之处,因此建议采用guid。
v_guid_part_two := SUBSTR (v_guid, 8, 4);
v_guid_part_three := SUBSTR (v_guid, 12, 4);
v_guid_part_four := SUBSTR (v_guid, 16, 4);
v_guid_part_five := SUBSTR (v_guid, 20, 12);
v_guid :=
CONCAT
(CONCAT
('{',CONCAT
(CONCAT
(CONCAT
(CONCAT (CONCAT (CONCAT (CONCAT (CONCAT (v_guid_part_one,
'-'),
v_guid_part_two
),
'-'
),
v_guid_part_three
),
'-'
),
v_guid_part_four
),
'-'
),
v_guid_part_five
)
),
'}'
);
RETURN (v_guid);
END GET_GUID;
/
Oracle的定义sequence例子:
create sequence seq_test
minvalue 10000
maxvalue 99999999999999999
start with 20000
increment by 1
cache 20
cycle
order;
从网络搜索得到的结论看,一般的意见总结为:
1.SYS_GUID()比sequence复杂;
2.SYS_GUID做主键,则表、索引存储开销多;
3.SYS_GUID索引查询比sequence慢;
但实际上,若每天5万条记录,则一年365*50000=18250000条记录,则理论上需要多耗费空间约合 1.46 GB 存储空间.显然,这些空间对当前的服务器的内存系统而言,影响并不大(按月分区), 就磁盘消耗而言都是微不足道的.
查询的时候用guid和sequence执行计划也是差不多的,也就是查询效率并不一定差。
从实践来看,使用SYS_GUID()做主键的优点多于负面影响。特别是在多个数据库数据集成时,GUID的优点显而易见。而关系数据库设计的法则约定:“主键不要代表任何意义”,更何况开发商既然提供这个功能而且一直在用,所以它的存在自有它的可取之处,因此建议采用guid。
的确,在现有项目中由于中小学数据库不在同一个数据库服务器上,user表中主建ID使用的是sequence方式。这样导致了项目在运行之2个库表的ID重复,很难整合在一起,因此想到了M记Sql Server中的GUID类型,使用它做为主键后跨主机跨数据库的ID重复将可以被有效解决,在将来可能的系统集成或迁移中将完全不受ID重复问题的困扰。
下面是ORACLE中利用SYS_GUID ()函数实现兼容M记Sql Server中GUID类型规格的GUID串:
CREATE OR REPLACE FUNCTION GET_GUID
RETURN CHAR
IS
v_guid CHAR (38);
v_guid_part_one CHAR (8);
v_guid_part_two CHAR (4);
v_guid_part_three CHAR (4);
v_guid_part_four CHAR (4);
v_guid_part_five CHAR (12);
BEGIN
SELECT SYS_GUID ()
INTO v_guid
FROM DUAL;
v_guid_part_one := SUBSTR (v_guid, 0, 8);RETURN CHAR
IS
v_guid CHAR (38);
v_guid_part_one CHAR (8);
v_guid_part_two CHAR (4);
v_guid_part_three CHAR (4);
v_guid_part_four CHAR (4);
v_guid_part_five CHAR (12);
BEGIN
SELECT SYS_GUID ()
INTO v_guid
FROM DUAL;
v_guid_part_two := SUBSTR (v_guid, 8, 4);
v_guid_part_three := SUBSTR (v_guid, 12, 4);
v_guid_part_four := SUBSTR (v_guid, 16, 4);
v_guid_part_five := SUBSTR (v_guid, 20, 12);
v_guid :=
CONCAT
(CONCAT
('{',CONCAT
(CONCAT
(CONCAT
(CONCAT (CONCAT (CONCAT (CONCAT (CONCAT (v_guid_part_one,
'-'),
v_guid_part_two
),
'-'
),
v_guid_part_three
),
'-'
),
v_guid_part_four
),
'-'
),
v_guid_part_five
)
),
'}'
);
RETURN (v_guid);
END GET_GUID;
/
- ORACLE的GUID主键生成
- 关于ORACLE的GUID主键生成
- 主键生成GUID-引
- 主键生成GUID-
- 主键生成GUID-引
- Oracle 生成Guid的方法
- Oracle生产固定GUID同时生成随机的GUID
- Oracle生成Guid的简单方法
- oracle生成guid
- Oracle 生成 GUID 类型
- Oracle 生成带 "-" GUID
- oracle生成随机数GUId
- oracle 触发器生成主键的
- oracle主键的自动生成
- Oracle中生成GUID类型
- Oracle中生成GUID类型
- Oracle中生成GUID类型
- Oracle中自动生成的guid与.Net中的guid的交互
- RPS和RFS实现分析
- 转换 iOS 用户界面到 Android 的 5 大要诀
- 黑马程序员----LINQ和ADO.NET概述
- Linux文件与Windows文件的文件/文件名编码转换方法
- window 2003群集IIS测试
- ORACLE的GUID主键生成
- Oracle左连接,右连接
- 不管你信不信,反正我信了。是这样实现的……
- 黑马程序员----通过DataList实现可以分页的数据源
- warning: control reaches end of non-void function
- IE6 中文乱码 解决方法
- 用Spring创建的JavaBean发布成Webservice
- Linux驱动 probe函数调用
- JQuery中$(function() {...}