使用特殊的 Dual 表读取序列

paw*_*que 2 oracle sequence

使用双表通过直接插入读取序列的 nextval 时是否会影响性能?

我目前正在优化大型 IT 系统中的性能,我发现几乎所有的 sequence.nextval 都是通过以下方式读取的:

SELECT SOME_SQ.NEXTVAL INTO someID FROM DUAL;
insert into .... (someId)
Run Code Online (Sandbox Code Playgroud)

我想知道在标准上使用上述方式时性能是否会受到影响:

insert into .... (some_sq.nexval, ...)
Run Code Online (Sandbox Code Playgroud)

谢谢

Jac*_*las 5

请注意,11g支持直接在 PL/SQL 中的序列表达式

否则,来自Oracle Docs

从 Oracle 数据库 10g 第 1 版开始,在计算不包含 DUMMY 列的表达式时,不会对 DUAL 表执行逻辑 I/O。此优化在执行计划中列为 FAST DUAL。

因此,任何性能提升都将是微不足道的。在以下测试中,我删除并重新创建了每次执行之间的表和序列:

试验台:

create sequence s;
create table t(id integer);
Run Code Online (Sandbox Code Playgroud)

测试:

declare
  n integer;
begin
  for i in 1..100000 loop
    select s.nextval into n from dual;
    insert into t(id) values(n);
  end loop;
end;
/
--average about 5s

declare
  n integer;
begin
  for i in 1..100000 loop
    insert into t(id) values(s.nextval) returning id into n;
  end loop;
end;
/
--average about 4s

begin
  for i in 1..100000 loop
    insert into t(id) values(s.nextval);
  end loop;
end;
/
--average about 3s
Run Code Online (Sandbox Code Playgroud)

您可能应该在您自己的环境中重新运行这些测试或类似的测试。