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

如何在Oracle中生成物理排序的GUID作为主键?,oracle,guid,Oracle,Guid,我正在尝试在Oracle中生成排序后的GUID作为主键。在SQL Server中,我可以使用以下方法之一对行进行物理排序 通过群集主键作为唯一标识符 由新闻界报道 我已经搜索了与Oracle等效的解决方案,但没有找到解决方案。我知道,但没有迹象表明SYS\u GUID()是否已排序 如何在Oracle中创建顺序主键?Oracle具有as SYS\u GUID()函数,该函数生成16字节的原始数据类型。但是,我不知道你说的“排序GUID”是什么意思。你能详细说明一下吗 您的意思是需要每个生成的GU

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

  • 通过群集主键作为唯一标识符
  • 由新闻界报道
  • 我已经搜索了与Oracle等效的解决方案,但没有找到解决方案。我知道,但没有迹象表明
    SYS\u GUID()
    是否已排序

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

    Oracle具有as SYS\u GUID()函数,该函数生成16字节的原始数据类型。但是,我不知道你说的“排序GUID”是什么意思。你能详细说明一下吗

    您的意思是需要每个生成的GUID在之前生成的GUID之后进行排序吗?我查看了SYS_GUID()函数,它似乎按排序顺序生成GUID,但是查看文档,我没有看到任何可以保证的东西

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

    您可以使用SYS_GUID()并在序列前面加上前缀,以获得所需的排序顺序

    你能详细解释一下你的用例吗

    针对评论添加以下内容:

    好了,现在我想我明白了。我认为您需要的是一种在Oracle中称为IOT或索引组织表的东西。它是一个具有索引结构的表,所有数据都是聚集的,或按主键分组的。有关更多信息,请访问:

    我认为这应该满足您的需要。

    Oracle具有as SYS_GUID()函数,该函数生成一个16字节的原始数据类型。但是,我不知道你说的“排序GUID”是什么意思。你能详细说明一下吗

    您的意思是需要每个生成的GUID在之前生成的GUID之后进行排序吗?我查看了SYS_GUID()函数,它似乎按排序顺序生成GUID,但是查看文档,我没有看到任何可以保证的东西

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

    您可以使用SYS_GUID()并在序列前面加上前缀,以获得所需的排序顺序

    你能详细解释一下你的用例吗

    针对评论添加以下内容:

    好了,现在我想我明白了。我认为您需要的是一种在Oracle中称为IOT或索引组织表的东西。它是一个具有索引结构的表,所有数据都是聚集的,或按主键分组的。有关更多信息,请访问:


    我认为这应该是您想要的。

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

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

    。。。存储在B树索引结构变体中的表。。。排 存储在表的主键上定义的索引中。每个 B树中的索引项还存储非键列值。因此 索引就是数据,数据就是索引

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

    我通常只在您不关心DML性能的情况下使用IOT,但在您进行大量范围扫描时,或者您需要按主键订购时才使用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;
    
    值得注意的是,即使使用物联网,您也必须使用明确的订购方,以保证返回的订单。但是,由于这种存储方式,Oracle可以提供一些捷径:

    select *
      from ( select * 
               from test_table 
               order by id )
     where rownum < 2
    
    选择*
    从(选择*
    从测试表
    按id订购)
    其中rownum<2
    


    与所有测试一样,不要假设这是您想要的结构。

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

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

    。。。存储在B树索引结构变体中的表。。。排 存储在表的主键上定义的索引中。每个 B树中的索引项还存储非键列值。因此 索引就是数据,数据就是索引

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

    我通常只在您不关心DML性能的情况下使用IOT,但在您进行大量范围扫描时,或者您需要按主键订购时才使用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;
    
    值得注意的是,即使使用物联网,您也必须使用明确的订购方,以保证返回的订单。然而,由于这种存储方式,Oracle可以