SELECT SYS_GUID() FROM DUAL
我有一些继承的代码,每次创建实体时都会调用。这意味着对于每次插入,都会对 Oracle 进行两次调用,一次用于获取Guid
,另一次用于插入数据。
我想这可能有一个很好的理由,例如 - Oracle 的 Guid 可能会通过顺序进行大量插入优化,因此他们可能试图避免过度的索引树重新平衡。
是否有理由使用SYS_GUID
而不是在客户端上构建自己Guid
的?
SELECT SYS_GUID() FROM DUAL
我有一些继承的代码,每次创建实体时都会调用。这意味着对于每次插入,都会对 Oracle 进行两次调用,一次用于获取Guid
,另一次用于插入数据。
我想这可能有一个很好的理由,例如 - Oracle 的 Guid 可能会通过顺序进行大量插入优化,因此他们可能试图避免过度的索引树重新平衡。
是否有理由使用SYS_GUID
而不是在客户端上构建自己Guid
的?
如果您已经为您提供了它,为什么还要自己滚动。另外,您不需要先抓住它然后插入,您只需插入:
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 十六进制版本更好)。序列可能还有其他好处,我没有做过任何广泛的比较,您可能希望先运行一些性能测试。
如果您关心的是两个数据库调用,您应该可以SYS_GUID()
在INSERT
语句中调用。您甚至可以使用一个RETURNING
子句来获取 Oracle 生成的值,以便将其包含在您的应用程序中以供进一步使用。
SYS_GUID 可以用作主键列的默认值,这通常比使用序列更方便,但请注意,这些值或多或少是随机的,而不是连续的。从好的方面来说,这可能会减少对热块的争用,但从坏的方面来说,您的索引插入也将无处不在。我们通常建议不要使用这种做法。
参考 点击这里
我发现没有理由从 Oracle 生成 Guid。对于每个 Guid,Oracle 和客户端之间的往返可能比偶尔发生的索引重新平衡(随机值插入)慢。