Медленные "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);