具有并发多实例插入的序列性能

Sequence performance with concurrent multi instance inserts

我在用sequence插入数据时遇到了问题,有熟悉oracle的朋友帮忙解释一下是什么原因造成的吗?

准备:

1.create table 有 2 个字段(id 号,名称 varchar), 2.create sequence (increment by 1 ,no cache/cache 10000) (create sequence seqt1 increment by 1 start with 1 nomaxvalue nocache) 3.a 持续做插入操作30s更新序列的程序(INSERT INTO OCCITEST VALUES(seqt1.nextval,'T1'))

然后我写了一个批处理脚本到 运行 程序的多进程来更新序列(即 for /l %%i in (1,1,50) do (start cmd /c runtest.bat)), 并查询插入了多少日期table 以检查并发多实例插入数据时序列的性能。

这里有一个奇怪的情况,批处理脚本执行后性能会下降,比如第一次测试30秒内插入了162364条数据到table,第二次测试只有100593条,而第三次只有54877,如果我删除序列并重新创建它,它将恢复正常(将近160000)。

我用cache 10000/nocache的序列测试过,好像也是一样的情况

谢谢大家!

我认为您的测试遇到了由序列缓存以外的原因引起的问题。你的序列性能比我在台式机上的体验差了多个数量级,而且随着时间的推移性能下降与我在序列问题上的体验不符。

一个 Oracle 数据库应该能够在一秒钟内用一个线程插入 160,000 个小行,使用默认值:

--DEFAULT CACHE (20): 0.8, 0.9, 0.7 seconds
drop table occitest;
drop sequence seqt1;
create sequence seqt1;
create table occitest(a number, b varchar2(100));
insert into occitest select seqt1.nextval, 'T1' from dual connect by level <= 162364;
rollback;

我可以使用序列选项 CACHE 100 将 运行 时间缩短到 0.4 秒,或者使用序列选项 CACHE 10000.

将时间缩短到 0.3 秒

我的代码明显与你的不同,但差异表明序列很可能不是造成 运行 次差的原因。 运行 插入 row-by-row 会将 运行 时间增加到 9 秒。 运行 带有提交的插入 row-by-row 将 运行 时间增加到 16 秒。 运行 带有提交的插入 row-by-row 和 NOCACHE 将 运行 时间增加到 27 秒。那些时间仍然比您的表现快,这意味着您的代码中至少还有一个其他“最糟糕的做法”。 (虽然有时那些“最坏的做法”是不可避免的——我们不能总是批处理所有操作。)

您的代码是否为每次插入重新连接?这可能是另一个 10 倍的性能问题,但对于连接池来说,这不是必需的。您的代码是否没有正确关闭连接 - 也许没有捕获到异常?这可能会消耗大量内存并导致 10 倍的性能问题。

在您真正开始查看序列性能之前,您需要解决其他问题。在那之后,如果您仍然认为序列是个问题,您可能想要查看 scalable sequences. You may also want to think about how sequence caching performance improvements operate similar to a harmonic sequence (1/N) and you will 。您应该看不到 100 的序列缓存与 10000 的序列缓存之间的显着差异。