2

我的一项服务需要很长时间才能执行。分析表明,nextval()特定顺序的调用每次大约需要 5 秒。为什么会这样,您有什么改进的建议吗?谢谢你。

语境

这是一个常规的 Spring 4.2.4 / Hibernate 5.1.0 应用程序,带有 Postgresql 9.6.3。慢服务 saveAndFlushes 一个新实体,其图形暗示了许多链接实体的插入(大约 60k)。

我已经用 DriverSpy 包装了驱动程序,以便将 SQL 语句打印到控制台。Hibernate 生成的 SQL 与关系模型一致,并且进行了适当的批处理(size=100)。nextval()但是,对链接实体的 id 序列的调用有很多次,每个调用大约需要 5s。

目标表包含大约 400 万条记录。

详细信息

序列信息(从 pgAdmin 获取):

  • 当前值 = 54225001
  • 增量 = 1000
  • 最小值 = 1
  • 最大值 = 9223372036854775807
  • cache = 1(我尝试了值 1000 和 10000,没有明显变化)
  • 循环=否

休眠信息(通过将 MappedSuperClass 与子类合并来简化):

@Entity
@SequenceGenerator(allocationSize = 1000, name = "generatorName", sequenceName = "sequenceName")
@Table(...)
public class XXX{

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generatorName")
    private Long id;

编辑:表的结构(和相关对象)

CREATE SEQUENCE seq_id_unit_brief
    START WITH 1
    INCREMENT BY 1000
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

CREATE TABLE unit_brief (
    id bigint NOT NULL,
    ubf_brief_id bigint NOT NULL,
    ubf_unit_id character varying(50) NOT NULL,
    ubf_start_date date NOT NULL,
    ubf_end_date date NOT NULL,
    modified_by character varying(100) NOT NULL,
    modified_time timestamp without time zone NOT NULL
);

ALTER TABLE ONLY unit_brief
    ADD CONSTRAINT pk_unit_brief PRIMARY KEY (id);

CREATE INDEX idx_unit_brief_brief_id ON unit_brief USING btree (ubf_brief_id);

CREATE INDEX idx_unit_brief_end_date ON unit_brief USING btree (ubf_end_date);

CREATE INDEX idx_unit_brief_start_date ON unit_brief USING btree (ubf_start_date);

ALTER TABLE ONLY unit_brief
    ADD CONSTRAINT fk_unit_brief_brief_id FOREIGN KEY (ubf_brief_id) REFERENCES brief(id);
4

0 回答 0