前一段时间,我在使用jdbc
插入/更新数百万条记录时遇到了数据库性能问题。为了提高性能,我将代码更改为使用batch
。然后,我决定使用jprofiler
监视代码,以了解性能提高了多少……但是与此同时,监视却发现了一件奇怪的事!
从上面的屏幕截图中可以看到,从序列中生成新的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任务已终止。
答案 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个数字。 如果您重现上面的测试,则可以简要估算出如果更改实现以消除序列号的额外往返路程,可以达到的目标