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 -“增量”和“缓存”的主要内容,如果未能解决你的问题,请参考以下文章