[Thomas John Sødring]
Indekser opprettes i @Entity klassene. Man kan se et eksempel på det i DocumentObject.java:
@Table(name = TABLE_DOCUMENT_OBJECT, indexes = @Index(name = "index_filname", columnList = "original_filename"))
Disse må hardkodes. Grunnen det ikke har vært fokus på det er fordi når vi brukte spring-data-jpa med repositories så ble de opprettet automatisk dersom det var et søk på et attributt. Senere tok vi i bruk og forkastet elasticsearch så behovet for indekser var fraværende da ES skulle ta seg av slike søk.
Takk. Jeg skal teste følgende endring i dag, og håper det gir de samme indeksene som jeg manuelt lagde via psql for testing i går:
diff --git a/src/main/java/app/domain/noark5/bsm/BSMBase.java b/src/main/java/app/domain/noark5/bsm/BSMBase.java index 013400564..a8d995ee9 100644 --- a/src/main/java/app/domain/noark5/bsm/BSMBase.java +++ b/src/main/java/app/domain/noark5/bsm/BSMBase.java @@ -23,7 +23,21 @@ import static app.utils.constants.Constants.*; import static jakarta.persistence.FetchType.LAZY;
@Entity -@Table(name = TABLE_BSM_BASE) +@Table(name = TABLE_BSM_BASE, + indexes = { + @Index(name = TABLE_BSM_BASE + "_" + BSM_FILE_ID + "_index", + columnList = BSM_FILE_ID), + @Index(name = TABLE_BSM_BASE + "_" + BSM_RECORD_ID + "_index", + columnList = BSM_RECORD_ID), + @Index(name = TABLE_BSM_BASE + "_" + BSM_PART_ID + "_index", + columnList = BSM_PART_ID), + @Index(name = TABLE_BSM_BASE + "_" + BSM_CORRESPONDENCE_PART_ID + "_index", + columnList = BSM_CORRESPONDENCE_PART_ID), + @Index(name = TABLE_BSM_BASE + "_" + BSM_DOCUMENT_DESCRIPTION_ID + "_index", + columnList = BSM_DOCUMENT_DESCRIPTION_ID), + @Index(name = TABLE_BSM_BASE + "_" + BSM_ADMINISTRATIVE_UNIT_ID + "_index", + columnList = BSM_ADMINISTRATIVE_UNIT_ID) + }) @JsonDeserialize(using = BSMDeserializer.class) @LinksPacker(using = BSMBaseLinksBuilder.class) @LinksObject(using = BSMBaseLinks.class)
Med slike indekser på plass tok importen av leganto-data rundt ni og en halv time, så det virker som de hadde positiv effekt. Det kom inn rundt 8.3 registreringer per sekund denne gangen, litt høyere enn uten indekser.
ER blitt tipset om følgende triks for å hente ut trege PostgreSQL-forespørsler:
SELECT calls, mean_exec_time, query FROM pg_stat_statements WHERE userid = 'pgsql_user'::regrole AND mean_exec_time > 200 ORDER BY calls DESC;
Det gir tips om hvilke indekser som kan hjelpe. Regner med at eksporten også vil trenge noen indekser for å få opp farten.