作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
不久前,我在使用jdbc
插入/更新数百万条记录时遇到了数据库性能问题。为了提高性能,我更改了代码以使用batch
。然后我决定使用 jprofiler
监控代码以了解性能提高了多少......但同时监控我发现了一个奇怪的事情!
从上面的截图中可以看出,从序列生成新的 id 非常慢。屏幕截图非常具有描述性,我必须说第二行是对一个包含约 800 万条记录的表的内连接
查询,其本身和一些计算(将其时间与第三个查询的时间进行比较!)。
我向我们的 dba 询问了这个问题,他说了一些关于缓存序列的 Oracle 建议,但当我检查序列时,我发现它已经被缓存了。
CREATE SEQUENCE "XXXXXXXXXXXX_ID_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE;
有什么想法吗?
附:我认为 Hibenate 类似地使用序列来插入记录,实际上我正在寻找使用序列的最佳实践来提高使用 hibernate 的项目的性能。以上jdbc任务终止。
最佳答案
正如其他人的评论中所建议的那样 - 需要时间的不是数字的生成。考虑下面的示例 - 它消除了时间消耗中的网络和网络延迟。
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
在没有缓存的情况下,生成 100.000 个数字需要 5.86 秒。如果您重现上面的测试,您将得到一个简短的估计,如果您更改实现以消除序列号的额外往返,您可以实现什么目标
关于Oracle selectsequence.nextval from Dual 听起来太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54059604/
不久前,我在使用jdbc插入/更新数百万条记录时遇到了数据库性能问题。为了提高性能,我更改了代码以使用batch。然后我决定使用 jprofiler 监控代码以了解性能提高了多少......但同时监控
我是一名优秀的程序员,十分优秀!