Entity Framework Arithabort, pero aun así la consulta es lento

0

Pregunta

Tengo una consulta simple

var count =  await _context.ExchangeRate.AsNoTracking().CountAsync(u => u.Currency == "GBP");

La mesa tiene sólo 3 Columnas y 10 filas de datos.

Cuando traté de ejecutar la consulta desde Neto 5 proyecto es tomar alrededor de 2.3 segundos para la primera vez y 500ms (+- 100) para las solicitudes posteriores. Cuando llegué a la misma petición en SSMS se está volviendo en casi ningún momento (45ms como se ve en el analizador de sql).

He implementado ARITHABORT en EF desde aquí

Cuando veo en el Analizador de SQL es la configuración de ARITHABORT, pero todavía la consulta tarda el mismo tiempo para la primera solicitud y solicitudes posteriores.

sql profiler screen shot

¿Cómo puedo alcanzar la velocidad de la misma como SSMS velocidad de las consultas. Necesito la consulta a ejecutar realmente la velocidad de mi proyecto ha requisito para el retorno de la respuesta en 1 segundo (la Necesidad de realizar al menos 5 sencillos DB llamadas...si 1 toma 500ms, a continuación, es el cruce de 1 segundo requisito)

Editar

Intentó incluso con ADO.Net. El tiempo de ejecución tomaron como se ve en el Analizador de SQL es 40ms donde como cuando alcanzó el código es casi 400 ms. Tanta diferencia

        using (var conn = new SqlConnection(connectionString))
        {
            var sql = "select count(ExchangeRate) as cnt from ExchangeRate  where Currency = 'GBP'";

            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "SET ARITHABORT ON; " + sql;
            cmd.CommandType = CommandType.Text;
            cmd.Connection = conn;
            conn.Open();
            var t1 = DateTime.Now;
            var rd =  cmd.ExecuteReader();
            var t2 = DateTime.Now;
            TimeSpan diff = t2 - t1;

           Console.WriteLine((int)diff.TotalMilliseconds);
          
          while (rd.Read())
          {
               Console.WriteLine(rd["cnt"].ToString());
          }
            conn.Close();
        }
1

Mejor respuesta

0

Su "primera ejecución" escenario general es la inicialización estática de la DbContext. Aquí es donde el DbContext obras de sus asignaciones para la primera vez y se producen cuando la primera consulta se ejecuta. El enfoque típico para evitar que esto ocurra para que un usuario es un simple "calentar" la consulta que se ejecuta cuando se inicia el servicio.. Por ejemplo después de que su servicio se inicializa, simplemente poner algo como lo siguiente:

// Warm up the DbContext
using (var context = new AppDbContext())
{
    var hasUser = context.Users.Any();
}

Esto también sirve como una rápida puesta en marcha, comprobar que la base de datos es accesible y de responder. La consulta se hará una operación muy rápida, pero el DbContext va a resolver sus asignaciones en este momento por lo que cualquier recién generado DbContext que las instancias de responder sin incurrir en coste que durante una solicitud.

Como para el rendimiento bruto, si no es una consulta que se espera que tome un tiempo y atar una solicitud, no hacen async. Peticiones asíncronas son no más rápido, de hecho, son un poco más lento. El uso de async las solicitudes en contra de la DbContext es la de garantizar que su servidor web / subproceso de aplicación es sensible, mientras que potencialmente costosas operaciones de base de datos a procesar. Si quieres una respuesta tan pronto como sea posible, utilice una llamada sincrónica.

A continuación, compruebe que todos los campos se están filtrando en contra, en este caso de la Moneda, están indizadas. Tener un campo llamado de la Moneda en su entidad como una Cadena en lugar de un CurrencyId FK (intapunta a una Moneda de registro es ya un extra de indexación de gastos como los índices de los números enteros son más pequeños y/o más rápido que los de cadenas.

Usted también no tiene que molestarse con AsNoTracking cuando se utiliza un Count consulta. AsNoTracking se aplica únicamente cuando se están volviendo entidades (ToList/ToArray/Single/Firstetc.) para evitar que el DbContext sosteniendo una referencia a la devolución de la entidad. Cuando se utiliza Count/Any o proyección a la devolución de las propiedades de las entidades que utilizan Select no hay ninguna entidad que regresó a la pista.

También cuenta la latencia de red entre el lugar donde el código de la aplicación se está ejecutando y el servidor de base de datos. Son la misma máquina o hay una conexión de red en un juego? ¿Cómo se compara esto cuando usted está realizando una SSMS consulta? El uso de un analizador puede ver lo que SQL EF es del envío a la base de datos. Todo lo demás en términos de tiempo es un costo de: Llegar la petición a la base de datos, Obtención de los datos resultantes de vuelta a la solicitante, el análisis de la respuesta. (Si en el caso de que usted está regresando entidades, la asignación, rellenar, comprobando en contra de referencias existentes, etc... En el caso de los recuentos etc. verificación de la existencia de referencias)

Por último, para asegurarse de que está recibiendo el máximo rendimiento, asegúrese de que su DbContexts tiempos de vida cortos. Si un DbContext se mantiene abierta y ha tenido un número de seguimiento de la ejecución de consultas en contra (Selección de entidades sin AsNoTracking) aquellos seguimiento de las referencias de entidades acumulan y pueden tener un negativo impacto en el rendimiento de las consultas en el futuro, incluso si usted lo usa AsNoTracking como EF se ve a comprobar a través de su seguimiento de referencias para las entidades que podrían ser aplicables relacionados a sus nuevas consultas. Muchas veces veo a los desarrolladores de asumir DbContexts son "caras", así que deciden crear una instancia como poco como sea posible para evitar esos costos, sólo para terminar haciendo las operaciones más caras a lo largo del tiempo.

Con todo lo que considera, EF nunca será tan rápido como raw SQL. Es un ORM diseñado para proporcionar comodidad .Net applications cuando se trata de trabajar con los datos. Que la comodidad en el trabajo con las clases de entidad en lugar de sanear y escribir su propio raw SQL cada vez que viene con un costo.

2021-11-23 21:59:24

en cuanto a tu comentario acerca de la latencia de la Red, tanto SSMS & Net Código está en mi máquina. db que está en el servidor...y para otras cosas, solo tengo una consulta (este es un POC). Así que con la misma latencia de la red SSMS es capaz de recuperar en 40ms donde Netos como Código de tomar 500ms.....incluso trató con ADO.NET como se ha visto en la pregunta, está tomando 500ms
CrazyMonk

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................