Domanda

Ho un'applicazione ASP .Net MVC che utilizza Fluent NHibernate per accedere a un database Oracle. Io uso anche NHibernate Profiler per monitorare le query generate da NHibernate. Ho una query che è molto semplice (selezionando tutte le righe da una tabella con 4 colonne stringa). E 'utilizzato per la creazione di un report in formato CSV. Il mio problema è che la query sta prendendo molto tempo per correre, e vorrei avere un po 'più di comprensione le durate visualizzati nhprof. Con 65.000 righe, sta prendendo 10-20 secondi, anche se "solo database" la durata mostra solo qualcosa come 20 ms. cadute di linea non dovrebbe fare un sacco di questo tempo, perché i server sono sulla stessa LAN gigabit. Non mi aspetto che le persone siano in grado di individuare per me esattamente dove il collo di bottiglia è, ma quello che vorrei sapere è qualche dettaglio in più su come leggere le misure di durata in NHibernate Profiler.

Cosa è incluso nella parte "solo database", e ciò che è incluso nel "Tempo totale"? Ha il tempo totale comprendono anche l'elaborazione fatto dopo che popolano gli oggetti # C, in modo che questa volta è in realtà per l'intera richiesta http? Sapere di più su questo si spera farmi in grado di eliminare alcuni fattori.

Questa cosa gli sguardi classe mappatura NHibernate come:

Table("V_TICKET_DETAILS");

CompositeId()
     .KeyProperty(x => x.TicketId, "TICKET_ID")
     .KeyProperty(x => x.Key, "COLUMN_NAME")
     .KeyProperty(x => x.Parent, "PARENT_NAME");

 Map(x => x.Value, "COLUMN_VALUE");

E la query generata da profiler NH è in questo modo:

SELECT this_.TICKET_ID    as TICKET1_35_0_,
       this_.COLUMN_NAME  as COLUMN2_35_0_,
       this_.PARENT_NAME  as PARENT3_35_0_,
       this_.COLUMN_VALUE as COLUMN4_35_0_
FROM   V_TICKET_DETAILS this_

La vista è molto semplice, solo unendo due tabelle su un numero intero 2 cifre.

Sono in alcun modo un esperto di database, quindi sarei felice per tutti i commenti che mi ricorda nella direzione corretta.

È stato utile?

Soluzione

Il tempo totale è per la chiamata al solo la query nHib.
Tuttavia, essa comprende, oltre al tempo nel db, il tempo necessario per popolare il nHib entità (idratazione). e che è probabile che il vostro colpevole.
Ho avuto un problema simile , forse alcuni dei suggerimenti ci possono aiutare.

La linea di fondo è che nHib non è realmente destinato per caricare grandi quantità di dati.
Se nessuno dei suggerimenti ti ho preso aiutato, vorrei suggerire un paio di cose:
1. E 'improbabile che le vostre esigenze degli utenti di visualizzare 65.000 righe di dati allo stesso tempo. forse si può trovare un modo per filtrare i dati in modo che il set di risultati è più piccolo (e più leggibile).
2. otherwise- se è, come dici tu, un caso 'speciale' che solo si verifica quando si genera un RELAZIONE non devi usare nHib. si può semplicemente utilizzare, ad esempio, il buon vecchio' ADO.Net classi ...

Altri suggerimenti

c'è anche IStatelessSession che è destinato per tali situazioni. Esso non dispone di una cache di sessione e consente di risparmiare un sacco di lavoro. Dovrebbe essere molto più veloce.

using (var session = factory.OpenStatelessSession())
{
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top