Pregunta

El perfil de las consultas LINQ y sus planes de ejecución es especialmente importante debido al loco SQL que a veces se puede crear.

A menudo encuentro que necesito rastrear una consulta específica y me resulta difícil encontrarla en el analizador de consultas. A menudo hago esto en una base de datos que tiene muchas transacciones en ejecución (a veces servidor de producción), por lo que simplemente abrir Profiler no es bueno.

También he encontrado que tratar de usar el DataContext para rastrear es inadecuado, ya que no me da SQL, realmente puedo ejecutarme.

Mi mejor estrategia hasta ahora es agregar un número 'aleatorio' a mi consulta y filtrarlo en la traza.

LINQ:

where o.CompletedOrderID != "59872547981"

Filtro de perfil:

'TextData' like '%59872547981'

Esto funciona bien con un par de advertencias:

  • Tengo que tener cuidado de recordar eliminar los criterios o elegir algo que no afecte demasiado el plan de consulta. Sí, sé que dejarlo es pedir problemas.
  • Sin embargo, por lo que puedo decir, incluso con este enfoque necesito comenzar un nuevo seguimiento para cada consulta LINQ que necesito rastrear. Si voy a 'Archivo > Propiedades 'para una traza existente No puedo cambiar los criterios de filtro.

No puedes superar la ejecución de una consulta en tu aplicación y verla aparecer en el Profiler sin ningún esfuerzo adicional. Solo esperaba que alguien más hubiera encontrado una forma mejor que esto, o al menos sugiriera un token menos 'peligroso' para buscar que una consulta en una columna.

¿Fue útil?

Solución

Jugar con la cláusula where quizás no sea lo mejor, ya que puede afectar los planes de ejecución de sus consultas y lo afectará.

Haga algo funky con la proyección en clases anónimas en su lugar: use un nombre único de columna estática o algo que no afecte el plan de ejecución. (De esa manera, puede dejarlo intacto en el código de producción en caso de que luego necesite hacer un perfil del código de producción ...)

from someobject in dc.SomeTable
where someobject.xyz = 123
select new { MyObject = someobject, QueryTraceID1234132412='boo' }

Otros consejos

Puede usar el Visualizador de depuración de Linq to SQL - http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx y mírelo en la ventana del reloj.

O puede usar DataContext.GetCommand (); para ver el SQL antes de que se ejecute.

También puede mirar el DataContext.GetChangeSet () para ver lo que se va a insertar / actualizar o eliminar.

Puede hacer que su contexto de datos cierre la sesión del SQL sin procesar, que luego puede buscar en el generador de perfiles para examinar el rendimiento.

using System.Diagnostics.Debugger;

yourDataContext.Log = new DebuggerWriter();

Todas sus consultas SQL se mostrarán en la ventana de salida del depurador ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top