Si è verificato un problema di prestazioni interessante con Entity Framework. Sto usando il codice prima.Entity Framework Performance Issue
Ecco la struttura dei miei soggetti:
un libro può avere molte recensioni. Una revisione è associata a un singolo libro. Una revisione può avere uno o più commenti. Un commento è associato a una revisione.
public class Book
{
public int BookId { get; set; }
// ...
public ICollection<Review> Reviews { get; set; }
}
public class Review
{
public int ReviewId { get; set; }
public int BookId { get; set; }
public Book Book { get; set; }
public ICollection<Comment> Comments { get; set; }
}
public class Comment
{
public int CommentId { get; set; }
public int ReviewId { get; set; }
public Review Review { get; set; }
}
Ho compilato il mio database con molti dati e aggiunto gli indici corretti. Sto cercando di recuperare un singolo libro che ha 10.000 recensioni su di esso utilizzando questa query:
var bookAndReviews = db.Books.Where(b => b.BookId == id)
.Include(b => b.Reviews)
.FirstOrDefault();
Questo particolare libro ha 10.000 recensioni. Le prestazioni di questa query sono di circa 4 secondi. L'esecuzione della stessa esatta query (tramite SQL Profiler) in realtà ritorna in men che non si dica. Ho usato la stessa query e un oggetto SqlDataAdapter e oggetti personalizzati per recuperare i dati e avviene in meno di 500 millisecondi.
Utilizzando ANTS Profiler performance sembra un grosso del tempo viene speso facendo un paio di cose diverse:
Il Equals metodo viene chiamato 50 milioni di volte.
Qualcuno sa perché sarebbe necessario chiamare questo 50 milioni di volte e come potrei aumentare le prestazioni per questo?
Hai effettivamente cercato di vedere quale query viene generata dalla tua istruzione o stai assumendo che sia la query ottimale? –
Dai una prova a EF Profiler. –
Il problema non è la query come ho affermato. Ho preso la query esatta che EF sta generando e l'ho usata in un Sql Data Adapter usando ADO.net regolare, caricando manualmente gli stessi oggetti. Funziona in meno di un secondo. – Dismissile