El executeTime a continuación es 30 segundos la primera vez, y 25 segundos la próxima vez que ejecuto el mismo conjunto de código. Cuando miro en el Analizador de SQL, inmediatamente veo un inicio de sesión, luego permanece allí por unos 30 segundos. Luego, tan pronto como se ejecuta la instrucción de selección, la aplicación finaliza el comando ToList. Cuando ejecuto la consulta generada desde Management Studio, la consulta de la base de datos solo toma alrededor de 400 ms. Devuelve 14 filas y 350 columnas. Parece que el tiempo que lleva transformar los resultados de la base de datos a las entidades es tan pequeño que no es notorio.¿Por qué Entity Framework tarda 30 segundos en cargar registros cuando la consulta generada solo tarda 1/2 segundo?
Así que lo que está sucediendo en los 30 segundos antes de la llamada base de datos se hace?
Si marco de la entidad es este lento, no es posible que nosotros utilizamos. ¿Hay algo que estoy haciendo mal o algo que puedo cambiar para acelerar esto dramáticamente?
ACTUALIZACIÓN: bien, si uso una consulta compilada, la primera vez que se tarda 30 segundos, y la segunda vez que se necesita 1/cuarto de segundo. ¿Hay algo que pueda hacer para acelerar la primera llamada?
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;
}
Esto parece tan contra intuitivo. Hacer múltiples solicitudes de SQL y cargar la misma cantidad de objetos es más rápido que hacer una solicitud SQL. – toxaq
Chris, parece que sabes mucho sobre .include, ¿puedes echar un vistazo a mi publicación? Http://stackoverflow.com/questions/10320174/speed-up-return-of-linq-entity-result –
@bugz - Eché un vistazo. Lo siento, hombre, no tengo idea. Debo señalar que al final estaba extremadamente insatisfecho con ASP.net y el marco de la entidad. Todo lo que hice tomó demasiado tiempo. Actualmente estoy volviendo a escribir esa aplicación completa en el motor de la aplicación de Google. –