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