我有一些继承的代码,每次创建实体时都会调用SELECT SYS_GUID() FROM DUAL
。这意味着每次插入都会有两次调用Oracle,一次调用Guid
,另一次调用数据。
我认为可能有一个很好的理由,例如 - Oracle的Guids可以通过顺序优化大批量插入,因此他们可能试图避免过多的索引树重新平衡。
是否有理由使用SYS_GUID
而不是在客户端上构建自己的Guid
?
答案 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