Oracle SEQUENCE -“增量”和“缓存”

Posted

技术标签:

【中文标题】Oracle SEQUENCE -“增量”和“缓存”【英文标题】:Oracle SEQUENCE - 'increment by' and 'cache' 【发布时间】:2019-08-29 17:52:00 【问题描述】:

我将 JPA 和 hibernate 一起用于我的 Spring 引导应用程序。我在批量操作时面临一些插入性能问题。到目前为止,我发现的修复是:

    更改 Oracle 序列更新 'Increment by > 1,我给 50' 在 Java 实体中,使用 allocationSize 与 Oracle Increment By 相同的值

这样 JPA 会阻止调用获取下一个序列。 我的序列定义为: CREATE SEQUENCE MYSCM.BOOKING_SCHED_SEQ INCREMENT BY 1 MAXVALUE 9999999999999999999999999999 MINVALUE 1 CACHE 20

当我将INCREMENT BY 增加到 50 时,缓存应该增加到 50 还是减少?

【问题讨论】:

【参考方案1】:

当我将 INCREMENT BY 增加到 50 时,缓存应该增加到 50 还是减少?

两者都不是。 INCREMENT BY 和 CACHE 之间没有关系。

INCREMENT BY 控制序列的单调方面。随着 INCREMENT BY 50,系列转到 1, 51, 101, 151 等等。

CACHE 控制在内存中保存多少序列号来服务 NEXTVAL 请求。 CACHE 数越小,数据库就越频繁地从其内部表中读取以获取下一个分配范围。因此,在一个中等繁忙的系统中,我们希望最小化获取的锁存器的数量,因此我们将 CACHE 设置为一个较高的数字,例如 1000。

人们痴迷于设置 CACHE 值,因为他们认为如果它太高,他们可能会“丢失”一些值并在他们的系列中出现差距。这极不可能发生,即使发生,我们也不应该在意。序列是保证唯一值的来源,没有进一步的意义。


虽然重新阅读了您的问题,但我认为这不会对您的批量插入的性能产生任何影响。你为什么选择专注于序列分配?你有没有运行任何跟踪来发现瓶颈在哪里?你和你的 DBA 谈过吗?

【讨论】:

是的。由于为每个记录发出sequence.nextval 查询,批量插入导致超时。我启用了批量插入,这有助于提高一些性能,但这仍然是个问题。 您使用的是哪个版本的 Oracle? 我使用的是 12C 版本 2 发布插入代码的片段。很可能您所说的 bulk insert 根本不是 bulk。我怀疑您正在为每一行创建一个 select 和一个 insert 语句。 不是限制的解决方案是一个选择 50 行。您必须至少激活 JDBC batch insert 才能在一次往返中插入一堆行。 @AlexandarPetrov - 是的,数据库缓存了序列

以上是关于Oracle SEQUENCE -“增量”和“缓存”的主要内容,如果未能解决你的问题,请参考以下文章

Sequence在Oracle中的使用

Sequence在Oracle中的使用

Sequence在Oracle中的使用

Oracle中Sequence使用

Oracle SEQUENCE 具体说明

Oracle修改序列(Sequence)起始值的方法