estoy recibiendo un error de tiempo de espera al intentar ejecutar una consulta LINQ (-to-SQL)Depuración de una dura LINQ a SQL Tiempo de espera
System.Data.SqlClient.SqlException: Tiempo de espera agotado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde.
Ahora bien, esto es no sólo un caso de una consulta lenta:
- corro el equivalente SQL en SQL Server Management Studio y se completa rápidamente (2 segundos)
- estoy estableciendo mi CommandTimeout en 2 minutos.
- Cuando ejecuto la misma consulta en una prueba unitaria, se completa de manera exitosa y rápida. Es decir: solo recibo este tiempo de espera cuando ejecuto esta consulta junto con otras consultas. El tiempo de espera siempre ocurre en la misma llamada.
El último elemento me hizo pensar que estoy atrapando un punto muerto en el lado de la base de datos: la consulta está bloqueada por un bloqueo y el tiempo de espera expira, matando la conexión estancada.
El problema con esta idea es que estoy solo haciendo selecciones en el DataContext que está causando problemas. (Tengo inserciones que ocurren en una base de datos/DataContexts diferente). Tampoco tengo transacciones explícitas. Esto me hace tropezar un poco: el comportamiento de la consulta se ve exactamente como un punto muerto, pero nunca he tenido un punto muerto que no haya sido causado por algún tipo de problema de aislamiento de transacción, y ese no es el caso aquí (a primera vista de todos modos).
Estoy buscando consejos sobre cómo solucionar este problema. ¿Qué tipo de cosas debería considerar para determinar la causa de este problema?
EDITAR
Algunas notas que pueden ser útiles:
- estoy consulta contra una vista que hace referencia:
- Otros puntos de vista en la misma base de datos
- sinónimos que apuntan a tablas en otra base de datos a través de un servidor vinculado.
- Este punto de vista está utilizando
union
a unirse a los resultados de varias consultas juntos
Epílogo
terminé de arreglar el problema central de reelaboración de mi consulta. El original llamaba algunas tablas más de una vez (a través de diferentes vistas). La versión modificada pasó por alto todo esto y los tiempos de espera desaparecieron.
cuando dice 'Ejecutar el SQL equivalente en SQL Management Studio' ¿quiere decir que está copiando el SQL real generado por LINQ de la salida de depuración? también: dado que tiene acceso a la base de datos, ¿puede aislar y monitorear el proceso real mientras se ejecuta en el Monitor de actividad? –
¿Ha ejecutado SQL Profiler al mismo tiempo que se está produciendo el problema? –
@E Rolnicki: Sí, obteniendo el SQL real de LINQ. –