Il modo più veloce per ottenere un singolo record con SubSonic
Domanda
Sono nuovo di SubSonic e Linq Stuff e sto provando a capire il modo più breve e ottimale per recuperare un singolo record.
Quale altro modo è più veloce e richiede meno codice per scrivere di questo per ottenere un singolo record?
User user2 = DB.Select().From(User.Schema)
.Where(User.PasswordColumn).IsEqualTo(password)
.And(User.SINumberColumn).IsEqualTo(siNumber)
.ExecuteSingle<User>();
Ho usato lo strumento AntsProfiler per verificare, e ciò richiede una media di 29,12 ms di tempo della CPU - testato su dieci esecuzioni
Dove ciò richiede ancora più tempo
UserController uc = new UserController();
Query query = new Query("User");
query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);
User user = uc.FetchByQuery(query).First<User>();
Solo l'ultima riga richiede 256.08ms di tempo CPU più UserController richiede 66.86ms.
Qualche suggerimento?
Soluzione
IIRC, l'oggetto Query è fluente .. cioè
query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);
Dovrebbe essere letto come:
query = query.WHERE(User.Columns.Password, password);
query = query.WHERE(User.Columns.SINumber, siNumber);
Il tempo maggiore nei test potrebbe essere considerato per questo motivo (stai chiedendo tutti gli oggetti utente e poi afferrando il primo).
Altri suggerimenti
Il "collo di bottiglia" sarebbe l'esecuzione della query generata, non SubSonic che la genera o restituisce il risultato. Se una determinata query è lenta, è necessario esaminare le funzioni di indicizzazione del proprio provider di database per ottimizzarlo.
Nel secondo caso, suppongo che il tempo di esecuzione aggiuntivo sia sovraccarico per LINQ per restituire il primo elemento dalla raccolta.
Quindi la mia risposta sarebbe, il primo modo è il modo migliore per farlo, e se 29ms non è accettabile (che per una chiamata a un DB, non credo sia irragionevole), aggiungi alcuni indici nel tuo DB per accelerare il recupero.
Penso che John abbia ragione sui soldi. Se vuoi davvero provare SubSonic per vedere quanto tempo ci vuole, devi provare quanto tempo impiega subsonic per creare l'istruzione SQL e non quanto tempo impiega SubSonic per creare l'istruzione SQL e quanto tempo impiega il tuo DB a restituire i risultati allo stesso tempo (è necessario isolare i test).
Forse dovresti testare quanto tempo ci vuole per ottenere i risultati con un vecchio SQLCommand regolare e passargli la tua connessione e parametri e vedere quanto tempo ci vuole per avere un confronto.