2012-03-24 14 views
7

Sto usando NHibernate e ho il codice come questo nella zona di mappatura:Quando si utilizza Nhibernate, come faccio a capire la dimensione ottimale del lotto nel codice di mappatura?

HasMany(x => x.People).AsBag().Inverse().Cascade.AllDeleteOrphan().Fetch.Select().BatchSize(80); 
    HasMany(x => x.Clothes).AsBag().Inverse().Cascade.AllDeleteOrphan().Fetch.Select().BatchSize(150); 

La mia domanda è: come faccio a capire quale sia il valore migliore per mettere in .BatchSize? Dovrei semplicemente mettere un numero alto. C'è un lato negativo nel mettere un numero troppo alto?

+1

È inoltre possibile controllare la dimensione del batch nella sessione di codice utilizzando session.SetBatchSize() –

risposta

5

Non c'è una sola risposta a questa domanda.

L'unico modo per determinare ciò che funziona meglio è profilare l'app nella produzione, con utenti reali che fanno cose reali. Questa operazione richiede molto tempo, quindi probabilmente è qualcosa che farai solo se trovi che l'app è lenta

Il rischio di un numero troppo elevato è che una query con molti parametri recupera un intervallo di record per ogni uno potrebbe essere più difficile sul DB di alcune query più piccole.

Inoltre, se non utilizzando tutte le collezioni che avete fatto riferimento (ad esempio, se è stato recuperato un elenco di PostCategories, ma si mostrano solo i messaggi di uno di loro), si potrebbe essere caricata molto di dati inutilmente.

Il mio consiglio è di iniziare con qualcosa come 20 o 50 (*) e renderlo più alto solo se spesso ti trovi a dover richiedere più del doppio di quel numero di raccolte caricate contemporaneamente.

(*): sì, ho tolto quei numeri dal mio sedere. 50 è quello che attualmente uso per impostazione predefinita.

2

Sebbene piuttosto vecchio, c'è un blog entry di Ayende, in cui confronta diverse dimensioni di batch (si pensi 10, 25, 250). Controlla. Potrebbe esserti utile.

+1

Il post del blog riguarda l'inserimento/l'aggiornamento/l'eliminazione batch, non il caricamento della raccolta. –

1

Generalmente il mio batch-size ha lo stesso valore della dimensione della pagina della GUI.

Quindi, se la dimensione della pagina è 25, è la dimensione del mio lotto. Non ho prove che questo è un buon valore da scegliere, ma se solo si sente il diritto di a me.

Tuttavia, l'unico vero modo è seguire ciò che @Diego ha scritto, eseguire un profiler sul server live per una settimana e analizzare i risultati. Cambiare l'esecuzione delle dimensioni del batch per un'altra settimana e analizzare entrambi i risultati. Tanto lavoro sospetto!

Non suggerirei un valore alto in quanto ciò potrebbe avere un impatto negativo. Un altro modo per osservare questo è se la dimensione del batch è alta, quindi potresti tornare a molti record nella dichiarazione select in primo luogo.

Problemi correlati