サービスの 1 つが実行に時間がかかります。分析によるnextval()
と、特定のシーケンスの呼び出しには、それぞれ約 5 秒かかります。それはなぜですか。これを改善するための提案はありますか? ありがとうございました。
環境
これは、Postgresql 9.6.3 を使用した通常の Spring 4.2.4 / Hibernate 5.1.0 アプリケーションです。遅いサービス saveAndFlushes は新しいエンティティを作成し、そのグラフは多くのリンクされたエンティティ (約 60k) の挿入を意味します。
ドライバーを DriverSpy でラップして、SQL ステートメントをコンソールに出力できるようにしました。Hibernate によって生成された SQL は関係モデルと一致しており、適切にバッチ処理されています (サイズ = 100)。ただし、リンクされたエンティティの ID シーケンスの呼び出しが多数ありnextval()
、それぞれに約 5 秒かかります。
ターゲット テーブルには、約 400 万のレコードが保持されます。
詳細情報
シーケンス情報 (pgAdmin から取得):
- 現在の値 = 54225001
- 増分 = 1000
- 最小 = 1
- 最大 = 9223372036854775807
- cache = 1 (値 1000 と 10000 を試しましたが、目に見える変化はありません)
- サイクル = いいえ
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);