Медленные "nextval" звонки

Выполнение одного из моих сервисов занимает много времени. Анализ показал, что nextval() вызовы определенной последовательности занимают около 5 секунд каждый. Почему это так, и у вас есть предложения по улучшению этого? Спасибо.

контекст

Это обычное приложение Spring 4.2.4 / Hibernate 5.1.0 с Postgresql 9.6.3. Медленный сервис saveAndFlushes новый объект, график которого подразумевает вставки множества связанных объектов (около 60 тыс.).

Я обернул драйвер с DriverSpy, чтобы печатать операторы SQL на консоли. SQL, сгенерированный Hibernate, согласуется с моделью отношений и правильно упакован (размер =100). Тем не менее, есть много звонков на nextval() последовательности идентификатора связанной сущности, каждая из которых занимает около 5 с.

Целевая таблица содержит около 4 миллионов записей.

Подробная информация

Информация о последовательности (взято из pgAdmin):

  • currentValue = 54225001
  • приращение = 1000
  • минимум = 1
  • максимум = 9223372036854775807
  • кэш = 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);

0 ответов

Другие вопросы по тегам