2

サービスの 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);
4

0 に答える 0