2012-01-16 63 views
7

Creo que tuve un error sql lamido en una publicación here hace un momento ... (Mensaje de error: Tiempo de espera caducado. El tiempo de espera transcurrido antes hasta la finalización de la operación o el servidor no responde. ") Estoy tratando de ejecutar esto con las herramientas de la base de datos en Visual Studio ... no en el estudio de administración, y no a través del código de cliente/ADO (todavía). Reescribí de manera justa consulta simple que usa un par de funciones personalizadas ... las funciones así como las partes de la consulta han sido probadas y todas funcionan bien, pero la consulta a continuación agota el tiempo de espera ... esto se ejecuta exactamente como se escribió en Management Studio, y toma unos 4 minutos. Como mencioné en mi otra publicación, cambié la configuración en Herramientas> Opciones> Diseñadores> "Anular valor de tiempo de espera de la cadena de conexión" a 120 segundos según esta publicación, pero ... todavía se agota el tiempo después 30 segundos. Agregar El ISNULL en esta última versión es el cambio que se está ejecutando en el estudio de administración.SQl Server sigue recibiendo el error de "Tiempo de espera caducado. El tiempo de espera ha transcurrido"

SELECT Symbol, LatestDate 
FROM (SELECT Symbol, ISNULL(dbo.LatestDateInDailyPricingVolBySymbol(Symbol), '1/1/1900') AS LatestDate FROM tblSymbolsMain) AS T2 
WHERE (LatestDate < dbo.RecentTradingDateByNumber(3)) 

La idea general es recuperar un subconjunto de símbolos de acciones que no tienen un punto de datos correspondiente en mi tabla de precios al día durante al menos 3 días. ¿Ningún arrendatario? Gracias a todos.

Respuesta

10

Sin importar su tiempo de espera;

¿Está utilizando la consola de administración sql para ejecutar su consulta? Si es así, al conectarse a la base de datos, hay un botón de opciones que permite establecer los tiempos de espera.

Connection Options

Además, si en la ventana de consulta, haga clic derecho y seleccione Opciones de consulta ....

0, significa ilimitado, me gustaría comprobar estos. 4 minutos es mucho tiempo, ¿tal vez la consulta se puede refactorizar para que se ejecute más rápido?

enter image description here

Si está ejecutando esto dentro de Visual Studio a través de C# el tiempo de espera de comando predeterminado es de 30 segundos. Modifíquelo configurando el tiempo de espera del comando:

SqlCommand comm= new SqlCommand(); 
comm.CommandTimeout = 300; 
+0

Como mentinoed se ejecuta en Management Studio pero lleva un tiempo ... Estoy intentando ejecutarlo con las herramientas sql en visual studio 2010. – StatsViaCsh

+0

@StatsViaCsh - Debe ser una configuración dentro de VS2010 que sea similar a la consola de administración de SQL Server. Si se generó código, se puede ajustar mediante código, pero tal vez haga clic con el botón derecho en la pantalla de consulta o en alguna otra opción. Lo siento, no uso VS2010 para ejecutar consultas, solo la consola de administración de SQL Server, así que no estoy familiarizado con esas pantallas. –

+0

@StatsViaCsh - Miré un poco alrededor de VS2010, puedo configurar el tiempo de espera de la conexión, pero no puedo encontrar el tiempo de espera del comando. Intentaría con el código en lugar de usar la herramienta, parece que está usando un valor predeterminado que no se puede cambiar fácilmente. –

1

Me preocupa que su rutina tome 4 minutos para empezar. Parece una consulta bastante simple, suponiendo que las funciones hacen lo que parecen hacer, y con la indexación y el diseño de tabla apropiado, debería volver mucho más rápido que eso.

¿Has mirado en el plan de ejecución para esta consulta:

SELECT Symbol, MAX(TradeDate) 
FROM tblSymbolsMain 
GROUP BY Symbol 
HAVING MAX(TradeDate) < dbo.RecentTradingDateByNumber(3) 

funciones escalares pueden ser problemas de rendimiento cuando se le llama varias veces en conjuntos con un gran número de filas, y también sargability daño.

+0

Gracias por la respuesta. ¡Parece realmente muy largo! No he revisado mi plan de ejecución ... No estoy seguro de cómo. Tuve la idea de hacer de esto un procedimiento almacenado que pueda establecer el valor de la función: dbo.RecentTradingDateByNumber (3) solo una vez, pero no sé si ese cambio sutil haría que cayera en la misma línea. Si tienes otro empujón, soy todo oídos. – StatsViaCsh

+0

@StatsViaCsh En Management Studio, hay una opción de menú para ver el plan de ejecución. Hay un ebook gratuito que le indicará cómo entender cómo se ve un mal plan de ejecución: http://www.simple-talk.com/books/sql-books/sql-server-execution-plans/ –

2

Si una consulta lleva tanto tiempo, es probable que sea algo erróneo. Declararía una variable para almacenar RecentTradingDateByNumber. Por lo que se ve así:

DECLARE @RecentTrandingDateByNumber DATETIME 
SET @RecentTrandingDateByNumber=dbo.RecentTradingDateByNumber(3) 

SELECT 
    tblSymbolsMain.Symbol, 
    MAX(tblSymbolsMain.TradeDate) 
FROM 
    tblSymbolsMain 
GROUP BY 
    Symbol 
HAVING 
    MAX(TradeDate) < @RecentTrandingDateByNumber 

Para ver la ejecución en el estudio de gestión vaya a "Consulta/Incluir plan de ejecución real". Si también desea ver el tráfico de la consulta, los números de seleccionar, etc. También puede incluir las estadísticas del cliente."Consulta/Incluir estadísticas de clientes"

Si desea conocer más información sobre el examen de la ejecución de consultas ver here

+1

Gracias por eso, es lo primero que voy a hacer hoy. – StatsViaCsh

Cuestiones relacionadas