我的一项服务需要很长时间才能执行。分析表明,某个序列的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抓取):
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);