Oracle从双重声音中选择sequence.nextval太慢

时间:2019-01-06 07:47:09

标签: oracle hibernate oracle11g database-performance sql-tuning

前一段时间,我在使用jdbc插入/更新数百万条记录时遇到了数据库性能问题。为了提高性能,我将代码更改为使用batch。然后,我决定使用jprofiler监视代码,以了解性能提高了多少……但是与此同时,监视却发现了一件奇怪的事!

enter image description here

从上面的屏幕截图中可以看到,从序列中生成新的id非常慢。屏幕截图非常具有描述性,只好我必须说第二行是一个对表进行inner join查询,表本身具有约800万条记录,并进行了一些计算(将其时间与第三个查询的时间进行比较!)。

我从dba询问了问题,他说了一些关于oracle建议的缓存序列的信息,但是当我检查了序列时,发现它已经缓存了。

CREATE SEQUENCE  "XXXXXXXXXXXX_ID_SEQ"  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE;

有什么想法吗?

p.s。我认为Hibenate类似地使用序列来插入记录,实际上我正在寻找最佳实践来使用序列来改善使用休眠模式的项目的性能。上述jdbc任务已终止。

1 个答案:

答案 0 :(得分:0)

正如其他人在评论中所建议的-花费时间不是数字的产生。 考虑下面的示例-从时间消耗中消除了网络和网络延迟。

SQL>  create sequence tst_seq start with 1 increment by 1; 

Sequence created.

SQL> set timing on
SQL> declare
  seqNo number(38,0); 
begin
  loop 
    select tst_seq.nextval into seqNo from dual; 
    exit when seqNo>=100000; 
  end loop; 
end;   2    3    4    5    6    7    8  
  9  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:05.86

不进行缓存,则需要5.86秒才能生成100.000个数字。 如果您重现上面的测试,则可以简要估算出如果更改实现以消除序列号的额外往返路程,可以达到的目标