Ciao Andrea,

sto scrivendo un articolo proprio su questo argomento! Quanto mi fa piacere vedere che se ne parli

Quello che tu citi è chiamato in letteratura "the n+1 SELECT problem", che purtroppo sei costretto a subire nel momento in cui visualizzi una collection di entity per essere poi costretto ad iterare su ognuna di esse ed effettuare ulteriori query per visualizzare alcune informazioni.

Uno dei compiti basilari di un ORM è per l'appunto quello di risolvere questo problema fornendo la possibilità di "eager-fetchare" questi dati, ad esempio con una join. Ancora meglio è quando un ORM ti consente di attivare/disattivare l'eager fetch, come fa EF tramite la keyword "Include", visto che ad es. in n-mila altre situazioni potrebbe non interessarmi minimamente il recupero dell'elenco dei libri di una persona.

Se ci pensi si tratta di feature che permettono un notevole fine-tuning delle query eseguite, e che non è così banale implementare in un DAL fatto a manina.
Modificato da Cradle il 16 agosto 2008 11.19 -
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
cradle ha scritto:
sto scrivendo un articolo proprio su questo argomento! Quanto mi fa piacere vedere che se ne parli

Non vedo l'ora di leggerlo
Quello che tu citi è chiamato in letteratura "the n+1 SELECT problem", che purtroppo sei costretto a subire nel momento in cui visualizzi una collection di entity per essere poi costretto ad iterare su ognuna di esse ed effettuare ulteriori query per visualizzare alcune informazioni.

Problema che ho avuto con Linq e Nhibernate, quel poco che l'ho usato
Se ci pensi si tratta di feature che permettono un notevole fine-tuning delle query eseguite, e che non è così banale implementare in un DAL fatto a manina.

Vero. L'unico modo che avevo trovato era con le xml query.

Ciao
andrewz ha scritto:
cradle ha scritto:
Quello che tu citi è chiamato in letteratura "the n+1 SELECT problem", che purtroppo sei costretto a subire nel momento in cui visualizzi una collection di entity per essere poi costretto ad iterare su ognuna di esse ed effettuare ulteriori query per visualizzare alcune informazioni.

Problema che ho avuto con Linq e Nhibernate, quel poco che l'ho usato


Beh, entrambi hanno soluzioni più che valide: con LINQ puoi modificare le DataLoadOptions, qui il primo esempio che ho trovato
http://blog.benhall.me.uk/2007/08/linq-to-sql-dataloadoptions-previously.html

NHibernate invece consente di impostare la strategia di fetch in una criteria query o in HQL, es.
ICriteria myCriteria = session.CreateCriteria(typeof(Author));
myCriteria.SetFetchMode("Books", FetchMode.Join);


Anyway, essendo NHibernate più avanti  , sono disponibili ben tre strategie di fetch: Join, Select e Lazy.
Le prime due servono per un eager load del dato, ma Join effettua, per l'appunto, una join, mentre Select usa una sola select separata (occhio, una select per tutti i Books, di tutti gli Authors, non una per Author), utile quando la join può essere onerosa.
Lazy invece imposta un proxy che consente di caricare la proprietà al primo utilizzo, pratica ovviamente sconsigliata se devi mostrarne una lista, altrimenti ricadi nelle n+1 select.
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
cradle ha scritto:
Beh, entrambi hanno soluzioni più che valide: con LINQ puoi modificare le DataLoadOptions, qui il primo esempio che ho trovato
http://blog.benhall.me.uk/2007/08/linq-to-sql-dataloadoptions-previously.html

Grazie per il link!
NHibernate invece consente di impostare la strategia di fetch in una criteria query o in HQL, es.
ICriteria myCriteria = session.CreateCriteria(typeof(Author));  
myCriteria.SetFetchMode("Books", FetchMode.Join);


Anyway, essendo NHibernate più avanti  , sono disponibili ben tre strategie di fetch: Join, Select e Lazy.
Le prime due servono per un eager load del dato, ma Join effettua, per l'appunto, una join, mentre Select usa una sola select separata (occhio, una select per tutti i Books, di tutti gli Authors, non una per Author), utile quando la join può essere onerosa.
Lazy invece imposta un proxy che consente di caricare la proprietà al primo utilizzo, pratica ovviamente sconsigliata se devi mostrarne una lista, altrimenti ricadi nelle n+1 select.

Ottimo a sapersi. Purtroppo con Nhibernate, come già detto, ci avevo solo giocato. Avevo fatto delle prove in merito, ma non ero mai riuscito - causa mia - a ottimizzare le query.

Ciao
Modificato da andrewz il 17 agosto 2008 11.56 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.