如何在Oracle中生成物理排序的GUID作为主键?

时间:2013-12-26 07:04:18

标签: oracle guid

我正在尝试将已排序的GUID生成为Oracle中的主键。在SQL Server中,我可以使用以下方法之一对物理行进行排序

  1. 通过群集主键作为唯一标识符。
  2. 按NEWSEQUENTIALID。
  3. 我搜索过Oracle等价物但未能找到解决方案。我知道Is there a way to create an auto-incrementing Guid Primary Key in an Oracle database?,但没有迹象表明SYS_GUID()是否已排序。

    如何在Oracle中创建顺序主键?

2 个答案:

答案 0 :(得分:3)

如果要创建GUID,那么SYS_GUID()就是您应该使用的,您可以根据链接的问题在表格中创建它。从文档中不清楚SYS_GUID()是否正在递增。 可能但是,这并不是一种可以传达信任的声明。

问题的下一部分(以及一些注释)一直在询问群集主键。这个概念在Oracle中的存在方式与在SQL Server和Sybase中的存在方式不同。 Oracle确实有indexed organized tables (IOT) ...

  

...存储在B树索引结构的变体中的表...行   存储在表的主键上定义的索引中。每   B树中的索引条目还存储非键列值。从而,   索引是数据,数据是索引。

物联网有很多用途,但值得注意的是,由于“性能原因”,你正在改变磁盘上数据库的物理结构。你正在使用具有消极和积极方面的东西来做所有过早优化的最终结果。阅读文档,确保这是您想要做的。

我通常只在你不关心DML性能但是你做了很多范围扫描时,或者你需要通过主键进行排序时才使用IOT。您可以像创建普通表一样创建IOT,但因为您想要的所有内容现在都是表的一部分,所以一切都在您的表定义中:

create table test_table (
   id raw(32) default sys_guid()
 , a_col varchar2(50)
 , constraint pk_my_iot primary key (id)
   ) organization index;

值得注意的是,即使使用IOT,也必须使用显式ORDER BY才能保证返回订单。但是,由于存储方式,Oracle可以提供一些快捷方式:

select *
  from ( select * 
           from test_table 
           order by id )
 where rownum < 2

SQL Fiddle

与所有事情一样,测试,不要认为这是你想要的结构。

答案 1 :(得分:1)

Oracle具有SYS_GUID()函数,它生成一个16字节的RAW数据类型。但是,我不确定你的意思是“排序的GUID”。你能详细说明吗?

你的意思是你需要每个生成的GUID来排序“之前”生成的GUID吗?我查看了SYS_GUID()函数,似乎以排序的顺序生成GUID,但是看一下文档,我没有看到任何可以保证的内容。

如果我理解你的问题,我不确定是否可能。

您可以使用SYS_GUID()并添加序列,以获得所需的排序顺序吗?

您能解释一下您的用例吗?

添加以下内容以回应评论:

好的,现在我想我明白了。我认为你想要的是在Oracle中称为IOT或索引组织表的东西。它是一个具有索引结构的表,所有数据都是聚类的,或者由主键分组。更多信息请点击这里: http://docs.oracle.com/cd/E16655_01/server.121/e17633/indexiot.htm#CNCPT721

我认为应该做你想做的事。