Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

358
Views
EF6 SQLQuery muy lento pero la base de datos es muy rápida

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.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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;)

over 4 years ago · Santiago Trujillo Report

0

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

  • Índices (No, la consulta es rápida)
  • Devolviendo demasiados datos (No, según la info que tengas)
  • Compilación de consulta lenta (No, se usa consulta SQL sin formato)
  • Transferencia de datos lenta (No, las otras consultas funcionan bien)
  • Inicialización lenta de DbContext (No, dijiste que no es la primera consulta)
  • Bloqueos de filas o tablas (no es probable, eso probablemente aparecerá como una consulta de ejecución prolongada en el generador de perfiles)
  • Materialización lenta (No, a pocos campos a menos que haya un error grave en el caso extremo)

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!