Le délai d'exécution ci-dessous est de 30 secondes la première fois et de 25 secondes la prochaine fois que j'exécute le même jeu de code. Lorsque vous regardez dans SQL Profiler, je vois immédiatement une connexion, puis il reste là pendant environ 30 secondes. Ensuite, dès que l'instruction select est exécutée, l'application termine la commande ToList. Lorsque j'exécute la requête générée à partir de Management Studio, la requête de base de données ne prend que 400 ms. Il renvoie 14 lignes et 350 colonnes. Il semble que le temps qu'il faut pour transformer les résultats de la base de données en entités est si petit qu'il n'est pas perceptible.Pourquoi Entity Framework prend-il 30 secondes pour charger des enregistrements lorsque la requête générée ne prend qu'une demi-seconde?
Alors ce qui se passe dans les 30 secondes avant que l'appel de la base de données est faite?
Si le framework d'entité est aussi lent, il ne nous est pas possible de l'utiliser. Y at-il quelque chose que je fais mal ou quelque chose que je peux changer pour accélérer cela de façon spectaculaire?
MISE À JOUR: D'accord, si j'utilise une requête Compilé, la première fois qu'il prend 30 secondes, et la deuxième fois qu'il faut 1/4 d'une seconde. Y a-t-il quelque chose que je puisse faire pour accélérer le premier appel?
using (EntitiesContext context = new EntitiesContext())
{
Stopwatch sw = new Stopwatch();
sw.Start();
var groupQuery = (from g in context.Groups.Include("DealContract")
.Include("DealContract.Contracts")
.Include("DealContract.Contracts.AdvertiserAccountType1")
.Include("DealContract.Contracts.ContractItemDetails")
.Include("DealContract.Contracts.Brands")
.Include("DealContract.Contracts.Agencies")
.Include("DealContract.Contracts.AdvertiserAccountType2")
.Include("DealContract.Contracts.ContractProductLinks.Products")
.Include("DealContract.Contracts.ContractPersonnelLinks")
.Include("DealContract.Contracts.ContractSpotOrderTypes")
.Include("DealContract.Contracts.Advertisers")
where g.GroupKey == 6
select g).OfType<Deal>();
sw.Stop();
var queryTime = sw.Elapsed;
sw.Reset();
sw.Start();
var groups = groupQuery.ToList();
sw.Stop();
var executeTime = sw.Elapsed;
}
Cela semble tellement contre-intuitif. Faire plusieurs requêtes SQL et charger le même nombre d'objets est plus rapide que de faire une requête SQL? – toxaq
Chris vous semblez connaître beaucoup de choses sur le .include pouvez-vous s'il vous plaît jeter un oeil à mon poste http://stackoverflow.com/questions/10320174/speed-up-return-of-linq-entity-result –
@bugz - J'ai regardé. Je suis désolé mec, je n'en ai aucune idée. Je devrais noter qu'à la fin j'étais extrêmement insatisfait avec ASP.net et cadre d'entité. Tout ce que j'ai fait a pris trop de temps. Je suis en train de réécrire cette application dans google app engine. –