sql >> Database teknologi >  >> RDS >> PostgreSQL

@BatchSize en smart eller dum brug?

  1. Ja, @BatchSize er beregnet til at blive brugt med dovne associationer.
  2. Hibernate vil alligevel udføre flere sætninger i de fleste situationer, selvom antallet af ikke-initialiserede proxyer/samlinger er mindre end den angivne batchstørrelse. Se dette svar for flere detaljer. Desuden kan flere lettere forespørgsler sammenlignet med mindre større bidrage positivt til systemets samlede gennemløb.
  3. @BatchSize på klasseniveau betyder, at den angivne batchstørrelse for enheden vil blive anvendt for alle @*ToOne dovne associationer til den enhed. Se eksemplet med Person enhed i dokumentationen.

De linkede spørgsmål/svar, du har givet, er mere bekymrede over behovet for optimering og doven indlæsning generelt. De gælder selvfølgelig også her, men de er ikke kun relateret til batchloading, hvilket blot er en af ​​de mulige tilgange.

En anden vigtig ting relaterer sig til ivrig læsning, som er nævnt i de linkede svar, og som antyder, at hvis en ejendom altid bruges, så kan du få bedre ydeevne ved at bruge ivrig læsning. Dette er generelt ikke sandt til indsamlinger og i mange situationer for to-one foreninger heller.

Antag for eksempel, at du har følgende entitet, for hvilken bs og cs er altid bruges når A bruges.

public class A {
  @OneToMany
  private Collection<B> bs;

  @OneToMany
  private Collection<C> cs;
}

Indlæser ivrigt bs og cs lider tydeligvis af N+1 vælger-problem, hvis du ikke slutter dig til dem i en enkelt forespørgsel. Men hvis du slutter dig til dem i en enkelt forespørgsel, for eksempel som:

select a from A
  left join fetch a.bs
  left join fetch a.cs

så opretter du fuldt kartesisk produkt mellem bs og cs og returnerer count(a.bs) x count(a.cs) rækker i resultatsættet for hver a som læses én efter én og samles til entiteterne A og deres samlinger af bs og cs .

Batchhentning ville være meget optimal i denne situation, fordi du først ville læse A s, derefter bs og derefter cs , hvilket resulterer i flere forespørgsler, men med meget mindre samlet mængde data, der overføres fra databasen. Desuden er de separate forespørgsler meget enklere end en stor med joinforbindelser og er nemmere for databasen at udføre og optimere.




  1. Slut med eliminering:Når SQL Server fjerner unødvendige tabeller

  2. Hent id fra en betinget INSERT

  3. PostgreSQL returnerer resultatet sat som JSON-array?

  4. SQL Inner join på udvalgte sætninger