我应该使用Oracle的sys_guid()来生成guid吗?

时间:2012-08-08 12:30:13

标签: oracle primary-key guid

我有一些继承的代码,每次创建实体时都会调用SELECT SYS_GUID() FROM DUAL。这意味着每次插入都会有两次调用Oracle,一次调用Guid,另一次调用数据。

我认为可能有一个很好的理由,例如 - Oracle的Guids可以通过顺序优化大批量插入,因此他们可能试图避免过多的索引树重新平衡。

是否有理由使用SYS_GUID而不是在客户端上构建自己的Guid

4 个答案:

答案 0 :(得分:7)

如果您已经提供给自己,为什么要自己动手。此外,您不需要先抓住它然后插入,您只需插入:

create table my_tab
(
val1 raw(16),
val2 varchar2(100)
);

insert into my_tab(val1, val2) values (sys_guid(), 'Some data');
commit;

您还可以将其用作主键的默认值:

drop table my_tab;
create table my_tab
(
val1 raw(16) default sys_guid(),
val2 varchar2(100),
primary key(val1)
);

这里不需要设置一个插入前的触发器来使用一个序列(或者在大多数情况下甚至关心val1或者它在代码中的填充方式)。

序列的维护也更多。更不用说在系统之间移动数据时的可移植性问题。

但是,序列是更人性化的imo(到目前为止,查看和使用数字比原始值的32十六进制版本更好)。序列可能还有其他好处,我还没有做过任何广泛的比较,你可能希望先进行一些性能测试。

答案 1 :(得分:4)

如果您担心的是两个数据库调用,则应该可以在SYS_GUID()语句中调用INSERT。您甚至可以使用RETURNING子句来获取Oracle生成的值,以便在应用程序中将其用于进一步使用。

答案 2 :(得分:1)

我发现没有理由从Oracle生成Guid。对于每个Guid,Oracle和客户端之间的往返行程可能比偶尔发生的索引重新平衡更慢,这是随机值插入。

答案 3 :(得分:1)

SYS_GUID可以用作主键列的默认值,这通常比使用序列更方便,但请注意值或多或少是随机的而不是顺序的。 On加号,可以减少热块的争用,但在负面,你的索引插入也将遍布整个地方。我们通常建议不要这样做。

供参考click here