EF 4.0 Performance Tips #1
Ya desde hace algún tiempo me rondaba por la cabeza la idea de poner post con tips de rendimiento a tener en cuenta dentro de Entity Framework 4.0, algunos de ellos serán más habituales y sencillos de resolver, otros por contra puede que sean más complicados de encontrar. Espero que la carga de trabajo me ayude a que los siguientes números no se dilaten demasiado :-)
Empezamos por una sencillita, ¿cual es la diferencia entre las siguientes consultas en Linq2Entities y que impacto podría tener en el rendimiento de las mismas?
A)
List<Author> result = (from a in context.Authors
where a.FirstName == "Unai"
select a).ToList();
B)
string searchedName = "Unai";
List<Author> result = (from a in context.Authors
where a.FirstName == searchedName
select a).ToList();
La respuesta a esta pregunta es sencilla, para la primera consulta, sin parametrizar, Entity Framework dispara una consulta AdHoc, ni siquiera DSE, con lo cual el plan de ejecución no se reaprovechará si esa misma consulta se realiza con valores de, en este caso, FirstName distintos al actual, forzando por lo tanto un movimiento muy grande de elementos en la cache de planes de ejecución y por lo tanto disminuyendo el rendimiento.
Para el caso de la consulta B, EF ejecuta esta consulta mediante sp_executesql ( Force Statment Caching ), gracias a lo cual esta consulta paremetrizada puede reutilizar el mismo plan de ejecución aun variando los valores de los parámetros.
Puede observar las diferencias de estos comportamientos ejecutando la siguiente consulta:
SELECT * from sys.dm_exec_cached_plans cp cross apply sys.dm_exec_sql_text(plan_handle)
Saludos
Unai