sql >> Databasteknik >  >> RDS >> PostgreSQL

@BatchSize en smart eller dum användning?

  1. Ja, @BatchSize är tänkt att användas med lata associationer.
  2. Hibernate kommer att köra flera satser i de flesta situationer ändå, även om antalet oinitierade proxyservrar/samlingar är mindre än den angivna batchstorleken. Se det här svaret för mer information. Dessutom kan fler lättare frågor jämfört med mindre större på ett positivt sätt bidra till systemets totala genomströmning.
  3. @BatchSize på klassnivå betyder att den angivna batchstorleken för entiteten kommer att tillämpas för alla @*ToOne lata associationer med den enheten. Se exemplet med Person enhet i dokumentationen.

De länkade frågorna/svaren du angav är mer oroade över behovet av optimering och lat laddning i allmänhet. De gäller förstås här också, men de är inte bara relaterade till batchladdning, vilket bara är ett av de möjliga tillvägagångssätten.

En annan viktig sak handlar om ivrig laddning som nämns i de länkade svaren och som antyder att om en fastighet alltid används så kan du få bättre prestanda genom att använda ivrig laddning. Detta är i allmänhet inte sant för samlingar och i många situationer för to-one föreningar heller.

Anta till exempel att du har följande entitet för vilken bs och cs är alltid används när A används.

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

  @OneToMany
  private Collection<C> cs;
}

Laddar ivrigt bs och cs uppenbarligen lider av N+1 väljer problem om du inte går med dem i en enda fråga. Men om du sammanfogar dem i en enda fråga, till exempel som:

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

sedan skapar du fullständig kartesisk produkt mellan bs och cs och returnerar count(a.bs) x count(a.cs) rader i resultatuppsättningen för varje a som läses en efter en och sätts ihop till enheterna A och deras samlingar av bs och cs .

Batchhämtning skulle vara mycket optimal i denna situation, eftersom du först skulle läsa A s, sedan bs och sedan cs , vilket resulterar i fler frågor men med mycket mindre total mängd data som överförs från databasen. Dessutom är de separata frågorna mycket enklare än en stor med kopplingar och är lättare för databasen att köra och optimera.




  1. En översikt över indexändringarna i PostgreSQL 11

  2. Hur gör jag en otydlig matchning av företagsnamn i MYSQL med PHP för automatisk komplettering?

  3. Hur man konverterar en Microsoft Access-rapport till PDF (3 sätt)

  4. Hur man använder en Oracle Associative Array i en SQL-fråga