日期:2014-05-16  浏览次数:20404 次

guid跟sequence做主键的比较

转的:

?

?

今天上班,发现一个同事用oracle的sys_guid()来做从一个表中随机获取6条记录:
select * from (select * from tablename order by sys_guid()) where rownum < 7;
看得出来是先创建guid,然后将表记录按照这个guid排序,再从中取头6条。
数据库主键用guid我倒是见过,这样用作取随机数倒是头一次碰上。

立刻又想到oracle用guid作主键,跟sequnce比较哪个更好。google中还是找到了一篇文章说的比较好:

http://sgsoft.itpub.net/post/28147/270097

?

最近又有朋友争论起 SYS_GUID sequence 谁做主键更合适的问题。下面我以一个案例说明一下,两者在实际应用中的情况。以下内容纯属个人研究,观点亦仅限于本案例

记得A项目组是一个物流管理系统,后台采用了Oracle数据库。在系统中的核心表托运单表中,关于主键采用何种数据类型,是 sequence 还是用GUID 大家起了争论。

从网络搜索得到的结论看,一般的意见总结为:
1.
SYS_GUID()比sequence复杂;
2.SYS_GUID做主键,则表、索引存储开销多;
3.SYS_GUID索引查询比sequence慢;
下面对SYS_GUID和Sequence做主键的情况进行以下对比.
edl@PISC> select count(*) from all_objects;

COUNT(*)

----------

50231

已用时间 : 00: 00: 02.52

创建下列对象:

create table tsg as select RAWTOHEX(sys_guid()) sgid,a.* from all_objects a;

create SEQUENCE seq_tsg;

create table tsg2 as select seq_tsg.nextval,a.* from all_objects a;

空间比较

现在这两个表:tsg和tsg2拥有的行数相同,但大小不同:

行数

Number Extents

Size in bytes

索引大小

TSG(SYS_GUID主键)

50231

23

8388608

3145728

TSG2(Sequence主键)

50231

21

6291456