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

@BatchSize un uso intelligente o stupido?

  1. Sì, @BatchSize è pensato per essere utilizzato con associazioni pigre.
  2. Hibernate eseguirà comunque più istruzioni nella maggior parte delle postazioni, anche se il conteggio di proxy/raccolte non inizializzati è inferiore alla dimensione del batch specificata. Vedi questa risposta per maggiori dettagli. Inoltre, query più leggere rispetto a quelle meno grandi possono contribuire positivamente al throughput complessivo del sistema.
  3. @BatchSize a livello di classe significa che la dimensione batch specificata per l'entità verrà applicata a tutti i @*ToOne pigre associazioni con quell'entità. Vedi l'esempio con la Person entità nella documentazione.

Le domande/risposte collegate che hai fornito sono più preoccupate per la necessità di ottimizzazione e caricamento lento in generale. Si applicano anche qui, ovviamente, ma non riguardano solo il caricamento batch, che è solo uno dei possibili approcci.

Un'altra cosa importante riguarda il caricamento ansioso che è menzionato nelle risposte collegate e che suggerisce che se una proprietà viene sempre utilizzata, è possibile ottenere prestazioni migliori utilizzando il caricamento ansioso. Questo in generale non è vero per le raccolte e in molte situazioni anche per le associazioni to-one.

Ad esempio, supponiamo di avere la seguente entità per cui bs e cs sono sempre usato quando A viene utilizzato.

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

  @OneToMany
  private Collection<C> cs;
}

Caricando con ansia bs e cs ovviamente soffre di problemi di selezione N+1 se non li unisci in una singola query. Ma se li unisci in una singola query, ad esempio:

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

quindi crei prodotto cartesiano completo tra bs e cs e restituendo count(a.bs) x count(a.cs) righe nel set di risultati per ogni a che vengono letti uno per uno e assemblati nelle entità di A e le loro raccolte di bs e cs .

Il recupero in batch sarebbe molto ottimale in questa situazione, perché dovresti prima leggere A s, quindi bs e poi cs , risultando in più query ma con una quantità totale di dati molto inferiore che viene trasferita dal database. Inoltre, le query separate sono molto più semplici di una grande con join e sono più facili da eseguire e ottimizzare per il database.