Tengo un problema de rendimiento, hemos realizado un montón de análisis y estamos atascados. Esperemos que alguno de ustedes haya visto esto antes.
Llamo a DbContext.Database.SqlQuery , la parte de la base de datos tarda 3 ms, pero la ejecución completa tarda 9 segundos.
Usamos EF Profiler para descubrir esto y también ejecutamos el SQL directamente en SQL Server Management Studio y es instantáneo.
También usamos vislumbrar y no pudimos ver lo suficientemente profundo en el proceso.
El tipo de resultado no es una entidad del modelo y, por lo tanto, estamos seguros de que el seguimiento no está involucrado.
También sabemos que esta no es la primera consulta ejecutada en el contexto, por lo tanto, no estamos pagando el costo de inicio de EF en esta consulta.
Probamos el generador de perfiles .net y tuvimos tantos problemas para ejecutarlo que decidimos preguntar.
¿Algún consejo sobre cómo profundizar y resolver esto?
EDITAR: el conjunto de resultados para esta consulta es 1 fila con 4 columnas (decimal)
La línea de código es simplemente:
var list=contextInstance.Database.SqlQuery<nonEntityType>(sqstring).ToList();El SQL en sí no es una cadena muy larga. Usaremos un generador de perfiles más detallado para averiguar en qué parte del proceso esto se está bloqueando.
Hemos utilizado el generador de perfiles EF para descubrir esto y también ejecutamos el SQL directamente en el estudio de administración del servidor SQL y es instantáneo.
Esto no prueba nada. La consulta puede ejecutarse rápidamente, pero los datos pueden generar 100 MB de datos que luego se transportan al cliente y se materializan en objetos. Esto podría tomar más tiempo de lo que piensas.
La consulta en SSMS puede devolverse instantáneamente porque muestra solo una parte de los datos. No dijiste cuáles eran los datos.
Utilice un perfilador de .NET real, como dotTrace o Ants. De esta manera, puede ver dónde se pierde el tiempo exactamente en la línea. EF Prof (o mi propio ORM Profiler: http://www.ormprofiler.com ) le dirá qué parte de la ruta total tomada (ORM->DB->ORM) toma qué tiempo. Incluso el profesor de EF lo hace;)
Si el cliente por alguna razón no puede usar un generador de perfiles como sugiere Frans, tendrá que jugar el juego de adivinanzas y excluir posibilidades.
En primer lugar, creo que falta una pieza crítica de información. ¿Siempre toma alrededor de 9 segundos o varía?
Primer paso:
Decida si el retraso es antes o después de que la consulta llegue a la base de datos. Debería ser posible hacerlo con EF Profiler y mirar las marcas de tiempo en Sql Profiler.
De cualquier forma habrás limitado un poco las posibilidades.
Segundo paso:
Excluir tanto como sea posible
Tercer paso:
¿Lo que queda? Eso depende de la respuesta al #1 y también si siempre son 9 segundos.
Mis principales sospechosos aquí son algún problema de conexión porque otra llamada está bloqueando, por lo que tiene que esperar una conexión o algún caché de segundo nivel o algo que no funciona bien con esta consulta.
Para excluir algunas alternativas más, intentaría ejecutar la misma consulta usando ADO.NET simple y antiguo. Si el problema persiste, sabe que no es un problema de EF y es muy probable que sea un problema de conexión. Sin embargo, si desaparece, aún podrían ser ambos problemas.
No tanto como una respuesta como algunas diatribas, pero con suerte algo en lo que no hayas pensado ya.