在PostgreSQL中删除查询花费的时间太长

时间:2020-01-27 09:54:48

标签: postgresql hibernate jpa

我正在使用带有hibernate jpa的spring boot创建和更新数据库。

实体看起来像这样

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "schedule_id")
    int scheduleId;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "event_id_fk")
    Event event;

    @NotNull
    @Column(name = "start_timestamp")
    Long startTimestamp;

    @NotNull
    @Column(name = "end_timestamp")
    Long endTimestamp;

实体的SQL看起来像这样。

 CREATE TABLE public.tbl_schedule
(
    schedule_id integer NOT NULL,
    end_timestamp bigint NOT NULL,
    start_timestamp bigint NOT NULL,
    event_id_fk integer NOT NULL,
    CONSTRAINT tbl_schedule_pkey PRIMARY KEY (schedule_id),
    CONSTRAINT fk1 FOREIGN KEY (event_id_fk)
        REFERENCES public.tbl_event (event_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
        NOT VALID
)

该表位于应用程序的核心,并在其他多个表中引用。我正在使用它根据开始和结束日期创建将来的事件及其数据。并且随着每个日期范围的更改,先前创建的事件将被删除并创建新的事件。 但是随着数据集增长到150,000+,删除操作开始花费的时间太长,而插入和选择工作得很好。 例如,表中存在约170,000条记录,而删除约700条记录则需要12分钟以上的时间。

我到目前为止所做的事情...

  1. 我创建了具有bigserial的同一表(无关系)的副本并将其转储到其中,整个删除操作在几秒钟内完成。
  2. 然后,我与其他所有表建立了在步骤1中创建的表的外键关系,该过程花费的时间稍长,但在一分钟内完成。
  3. 然后,我尝试通过创建新序列并更改表ID以使用该序列,然后从该表的最大ID重新启动,将bigserial应用于实际表。除非我截断该表,否则这没有任何作用。
  4. 我还尝试根据查询参数应用单个索引和组合索引,但都没有改善。
  5. 我还尝试按照
  6. 中的建议为该表的所有外键引用建立索引

postgresql-and-primary-key-foreign-key-indexing

我是PostgreSQL的新手,请帮助我改善此表的性能并指导我哪里出了问题。

我的最佳猜测是使用GenerationType.AUTO可以做到这一点。如果我使用了GenerationType.IDENTITY,则该表的性能会更好。在这种情况下,如何在不丢失数据和更改自动增量ID的情况下更新表。如果不是,请提出提高删除性能的解决方案。

预先感谢,如果您有任何疑问,请告诉我。

0 个答案:

没有答案