缓慢的“nextval”电话

时间:2017-08-11 13:06:32

标签: postgresql hibernate nextval

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

上下文

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

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

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

详细信息

序列信息(从pgAdmin抓取):

  • currentValue = 54225001
  • increment = 1000
  • minimum = 1
  • maximum = 9223372036854775807
  • cache = 1(我已尝试过值1000和10000,没有明显的变化)
  • cycled = no

Hibernate信息(通过将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);

0 个答案:

没有答案