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)

 

Untitled

 

 

Saludos

Unai

Published 1/7/2010 18:27 por Unai
Comparte este post:
http://geeks.ms/blogs/unai/archive/2010/07/01/ef-4-0-performance-tips-1.aspx

Comentarios

# re: EF 4.0 Performance Tips #1

Muy interesante Unai. Gracias

Friday, July 02, 2010 10:03 AM por Carlos

# re: EF 4.0 Performance Tips #1

Al final resulta que tenemos los mismos problemas en EF que en ADO.Net ¡No nos podemos olvidar de la importancia de la paremetrización!.

Menos más que si el problema es grave y ya le hemos liado parda SQL Server nos puede ayudar:

geeks.ms/.../como-detectar-cuando-las-consultas-no-parametrizadas-da-241-an-el-rendimiento-de-sql-server-y-que-hacer.aspx

Supongo que da igual usar LinqToSQL que LinqToEntities ¿no?.

!Me encanta la idea de esta serie!

Friday, July 02, 2010 12:17 PM por Rodrigo Corral

# re: EF 4.0 Performance Tips #1

Muy buen post Unai.

Rodrigo el tuyo también muy bueno.

Aunque no nos libremos del uso de parametros, me gusta esto de trabajar con EF o con LINQTOSQL!!

Friday, July 02, 2010 12:25 PM por Javier Torrecilla

# re: EF 4.0 Performance Tips #1

@javier, no hay duda, este asunto, que hay que tener en cuenta, no evita para nada que EF sea una excelente tecnología.

¡un saludo!

Friday, July 02, 2010 12:32 PM por Rodrigo Corral

# re: EF 4.0 Performance Tips #1

Bueno,

Esto parece que casa bien con el patrón Specification, no?

Salu2.

Friday, July 09, 2010 11:54 AM por Dominik

# re: EF 4.0 Performance Tips #1

Gracias a todos, responde algunos comentarios

Rodrigo: Con Linq2SQL todas las consultas son parametrizadas :-), cosas de la vidad.

Dominik, si efectivamente el uso de especificaicones te ayuda a no meter queries adhoc pero tampoco te lo libra si lo haces mal:-)

Saludos

Unai

Friday, July 09, 2010 4:31 PM por Unai

# EF 4.0 Performance Tips #3

En los dos primeras entregas, #1 y #2 hemos visto algunos pequeños elementos que harán mejorar de una

Wednesday, July 14, 2010 1:26 AM por O bruxo mobile

# re: EF 4.0 Performance Tips #1

Hola de nuevo,

Nosotros estamos siguiendo la "Guia de Arquitectura N-Capas orientada al Dominio" en nuestra nueva aplicación.

Hace unos dias realizamos unas primeras pruebas de rendimiento y a raiz de este post me dedique a revisar las querys SQL generadas.

Mi sorpresa fue que las querys SQL eran dinamicas, por lo que no se genera plan de ejecucion alguno...

Como es posible esto? Usando el patron Specification no deberian generarse querys parametrizadas? Estamos haciendo algo mal?

Saludos.

Thursday, July 15, 2010 2:27 PM por Dominik,

# re: EF 4.0 Performance Tips #1

Buenas Dominik,

Yo te recomendaría el USO de LINQPad para ver el SQL que se genera y así hacerte una idea del plan de ejecución que tendrá la consulta. Aplica TDD con varios escenarios sobre Especificaciones (Specifications) de consulta y ajusta dicho rendimiento. De todas formas hay que tener en cuenta que el purismo al límite tampoco es bueno, si estás tratando con SQL Server y con consultas muy complejas, podrías implementar una Specification que lanze un Stored Procedure, afectando solamente a esa specification y, en caso de querer cambiarlo que solamente afecte a la specification.

NOTA: Rodrigo tiene razón. Que bien funciona LINQ2SQL por dios! Y ahora más que en la versión de .net 4.0 ya han arreglado el tema del tamaño de varchars(x) al lanzar Stored Procedures y se reaprovecha la caché del plan de ejecución...

Thursday, July 15, 2010 7:23 PM por Ben

# re: EF 4.0 Performance Tips #1

Dominik,Asegúrate de que en las especificaciones las estas haciendo uso de variables tal y como se expone en este mismo post

Tuesday, July 20, 2010 10:24 AM por Unai

# EF 4.0 Performance Tips #5 (#1 Revisited )

El el primer tip de rendimiento sobre EF 4.0, #1 , hablamos sobre las diferencias que se producían si

Friday, July 30, 2010 10:07 AM por O bruxo mobile

# EF 4.0: Performance Tips – Recopilacion

Después de una serie un poco grande de post sobre una temática concreta siempre está bien hacer una pequeña

Tuesday, September 28, 2010 11:43 AM por O bruxo mobile

# re: EF 4.0 Performance Tips #1

Seguramente este preguntando una tonteria pero... ¿Es recomendable parametrizar cuando se usa Linq to Object o aqui no es necesario porque no trabajamos con ninguna base de datos?

Thursday, October 21, 2010 5:06 PM por desbarrao