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

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

  1. 更改 Oracle 序列更新 'Increment by > 1,我给 50'
  2. 在 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 还是减少?

【问题讨论】:

    标签: java oracle hibernate spring-boot jpa


    【解决方案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 - 是的,数据库缓存了序列
    猜你喜欢
    • 2020-08-23
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2022-06-16
    • 2020-02-13
    • 2022-08-06
    相关资源
    最近更新 更多