4

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

我想这可能有一个很好的理由,例如 - Oracle 的 Guid 可能会通过顺序进行大量插入优化,因此他们可能试图避免过度的索引树重新平衡。

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

4

4 回答 4

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 十六进制版本更好)。序列可能还有其他好处,我没有做过任何广泛的比较,您可能希望先运行一些性能测试。

于 2012-08-08T12:58:08.317 回答
4

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

于 2012-08-08T12:41:59.483 回答
2

SYS_GUID 可以用作主键列的默认值,这通常比使用序列更方便,但请注意,这些值或多或少是随机的,而不是连续的。从好的方面来说,这可能会减少对热块的争用,但从坏的方面来说,您的索引插入也将无处不在。我们通常建议不要使用这种做法。

参考 点击这里

于 2015-04-22T06:08:32.760 回答
1

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

于 2013-05-05T15:32:14.107 回答