c# asp.net entity-framework compiled-query

c# - ¿Cuándo debo usar un CompiledQuery?



asp.net entity-framework (5)

Debería usar una CompiledQuery cuando todo lo siguiente es verdadero:

  • La consulta se ejecutará más de una vez, variando solo por los valores de los parámetros.
  • La consulta es lo suficientemente compleja como para que el costo de la evaluación de la expresión y la generación de vistas sea "significativo" (prueba y error)
  • No está utilizando una función LINQ como IEnumerable<T>.Contains() que no funcionará con CompiledQuery .
  • Ya ha simplificado la consulta, lo que proporciona un mayor beneficio de rendimiento, cuando es posible.
  • No tiene la intención de seguir redactando los resultados de la consulta (por ejemplo, restringir o proyectar), lo que tiene el efecto de "descompilarlo".

CompiledQuery hace su trabajo la primera vez que se ejecuta una consulta. No da beneficio para la primera ejecución. Como cualquier ajuste de rendimiento, generalmente evítelo hasta que esté seguro de que está arreglando un punto de acceso de rendimiento real.

Actualización de 2012: EF 5 hará esto automáticamente (consulte " blogs.msdn.com/b/stuartleeks/archive/2012/06/12/… "). Así que agregue "No está utilizando EF 5" a la lista anterior.

Tengo una mesa

-- Tag ID | Name ----------- 1 | c# 2 | linq 3 | entity-framework

Tengo una clase que tendrá los siguientes métodos:

IEnumerable<Tag> GetAll(); IEnumerable<Tag> GetByName();

¿Debo usar una consulta compilada en este caso?

static readonly Func<Entities, IEnumerable<Tag>> AllTags = CompiledQuery.Compile<Entities, IEnumerable<Tag>> ( e => e.Tags );

Entonces mi método GetByName sería:

IEnumerable<Tag> GetByName(string name) { using (var db = new Entities()) { return AllTags(db).Where(t => t.Name.Contains(name)).ToList(); } }

Lo que genera un SELECT ID, Name FROM Tag y ejecute Where en el código. ¿O debería evitar CompiledQuery en este caso?

Básicamente quiero saber cuándo debo usar las consultas compiladas. Además, en un sitio web, ¿se compilan solo una vez para toda la aplicación?


Las consultas compiladas le ahorran tiempo, lo que se gastaría generando árboles de expresiones. Si la consulta se usa con frecuencia y guardará la consulta compilada, definitivamente debería usarla. Tuve muchos casos en que el análisis de consultas tomó más tiempo que el viaje de ida y vuelta real a la base de datos.

En su caso, si está seguro de que generaría SELECT ID, Name FROM Tag el caso WHERE (lo cual dudo, ya que su función AllQueries debería devolver IQueryable y la consulta real debería hacerse solo después de llamar a ToList ) - no debería t lo usas

Como alguien ya mencionó, en tablas más grandes, SELECT * FROM [someBigTable] tomaría mucho tiempo y pasará aún más tiempo filtrando eso en el lado del cliente. Por lo tanto, debe asegurarse de que su filtrado se realice en el lado de la base de datos, sin importar si está utilizando consultas compiladas o no.


Las consultas compiladas ofrecen una mejora de rendimiento, pero no es enorme. Si tiene consultas complejas, prefiero ir con un procedimiento almacenado o una vista, si es posible; Dejar que la base de datos haga su trabajo podría ser un mejor enfoque.


Las consultas compiladas se compilan cuando se compila la aplicación y cada vez que se reutiliza una consulta a menudo o si es complejo, debería probar las consultas compiladas para acelerar la ejecución.

Pero no me atrevería a hacerlo en todas las consultas, ya que es un poco más de código para escribir y para consultas simples puede que no valga la pena.

Pero para obtener el máximo rendimiento, también debe evaluar los Procedimientos almacenados donde realiza todo el procesamiento en el servidor de la base de datos, incluso si Linq intenta enviar la mayor cantidad de trabajo a la base de datos, tendrá situaciones en las que un procedimiento almacenado será más rápido.


Las consultas compiladas son más útiles con linq. Las consultas con grandes árboles de expresión dicen que las consultas complejas para obtener un rendimiento sobre la construcción del árbol de expresión una y otra vez mientras se reutiliza la consulta. En tu caso supongo que te ahorrará muy poco tiempo.