Error: Timeout expired.

31/10/2004 - 01:49 por Jorge Eldis | Informe spam
Buenas al Grupo,

Tengo una aplicacion que me gener el siguiente error:

Timeout expired. The timeout period elapsed prior to completion of the
operation or the server is not responding

Esto ocurre cuando trato de desplegar una lista que me devuelve un SP, y
pongo en un DataReader desde una aplicacion Web.

El Query que esta dentro del Stored Procedures es este:

SELECT NumeroOrigen, NumeroDestino, Fecha, Hora,
(SELECT MAX(CodigoArea)
FROM Destino
WHERE CodigoArea = SUBSTRING(NumeroDestino,
1, LEN(CodigoArea))) AS PrefijoDestino
FROM dbo.LLDate

Este Query lo que hace es darme una tabla la cual me da un Campo
"PrefijoDestino", este campo me devuelve solo una parte del numero sacando
el maximo en la tabla de Destinos.

Como son llamadas telefonicas hay muchos registros pueden estar en el orden
de los 250,000 y mas.

Aqui va el codigo

Public Class Class_Reportes


Dim objCnn As New Class_Conexion
Dim _IfError As Boolean
Dim _ErrMsg As String


Public Function Reporte(ByVal FechaIni As Integer, ByVal FechaFin As
Integer, ByVal Cnn As SqlConnection) As SqlDataReader

If objCnn.Cnn(Cnn) Then

Cnn.Open()

Dim myCommand As New SqlCommand
myCommand.Connection = Cnn

Try

myCommand.CommandTimeout = 0
myCommand.CommandText = "Reporte"
myCommand.CommandType = CommandType.StoredProcedure

Dim P As New SqlParameter

P = myCommand.Parameters.Add("@FechaIni", SqlDbType.Int)
P.Value = FechaIni

P = New SqlParameter
P = myCommand.Parameters.Add("@FechaFin", SqlDbType.Int)
P.Value = FechaFin

Return myCommand.ExecuteReader

_IfError = False

Catch ex As Exception

_IfError = True
_ErrMsg = ex.Message

End Try

End If


End Function

End Class


Saludos Jorge Eldis
 

Leer las respuestas

#1 Hector Bejarano
31/10/2004 - 03:33 | Informe spam
Hola Jorge,

Para empezar, siempre es recomendable utilizar el nombre de la tabla para el
campo que quieres seleccionar, tu select se deberia ver asi:

SELECT
Destino.NumeroOrigen,
Destino.NumeroDestino,
Destino.Fecha,
Destino.Hora,
(
SELECT
MAX(Destino.CodigoArea)
FROM
dbo.Destino as Destino
WHERE
Destino.CodigoArea = SUBSTRING(LLDate.NumeroDestino, 1,
LEN(Destino.CodigoArea))
) AS PrefijoDestino
FROM
dbo.LLDate as LLDate

Es una buena practica, clarifica el codigo, y ademas, permite al motor de
sql evitarse el ir a revisar a cual tabla pertenece cada campo, asi como
simplificar la revision de los campos ambiguos.

En segundo lugar, tu base de datos tiene un problema de diseño, no deberias
estar tomando el substring de NumeroDestino para conseguir el CodigoArea, la
forma correcta de hacerlo es creando el campo CodigoArea en la tabla
dbo.LLDate, y crear un foreign key, para garantizar la calidad de los datos.

No me queda claro cual es la estructura de los indices que estas pero, para
esto normalmente se recomienda utilizar el Index Tuning Wizard, en realidad
para tu consulta, comprobar que existen estos 2 indices deberia ser
suficiente:

LLDate
NumeroDestino
NumeroOrigen
Fecha
Hora

Destino
NumeroDestino
CodigoArea

Respeta el orden de los campos como estan ahi, y recuerda hacer una
recompilacion del SP una vez que este listo para que se vuelva a generar el
arbol de ejecucion.

Por el tamano de la tabla, SQL Server deberia de manejar tu consulta
facilmente, he trabajado con tablas grandes, y te puedo decir que el tiempo
de respuesta que puedes esperar es bastante razonable, y no necesariamente
recibir un timeout.

Saludos,
Hector Bejarano.

"Jorge Eldis" wrote in message
news:
Buenas al Grupo,

Tengo una aplicacion que me gener el siguiente error:

Timeout expired. The timeout period elapsed prior to completion of the
operation or the server is not responding

Esto ocurre cuando trato de desplegar una lista que me devuelve un SP, y
pongo en un DataReader desde una aplicacion Web.

El Query que esta dentro del Stored Procedures es este:

SELECT NumeroOrigen, NumeroDestino, Fecha, Hora,
(SELECT MAX(CodigoArea)
FROM Destino
WHERE CodigoArea = SUBSTRING(NumeroDestino,
1, LEN(CodigoArea))) AS PrefijoDestino
FROM dbo.LLDate

Este Query lo que hace es darme una tabla la cual me da un Campo
"PrefijoDestino", este campo me devuelve solo una parte del numero sacando
el maximo en la tabla de Destinos.

Como son llamadas telefonicas hay muchos registros pueden estar en el
orden de los 250,000 y mas.

Aqui va el codigo

Public Class Class_Reportes


Dim objCnn As New Class_Conexion
Dim _IfError As Boolean
Dim _ErrMsg As String


Public Function Reporte(ByVal FechaIni As Integer, ByVal FechaFin As
Integer, ByVal Cnn As SqlConnection) As SqlDataReader

If objCnn.Cnn(Cnn) Then

Cnn.Open()

Dim myCommand As New SqlCommand
myCommand.Connection = Cnn

Try

myCommand.CommandTimeout = 0
myCommand.CommandText = "Reporte"
myCommand.CommandType = CommandType.StoredProcedure

Dim P As New SqlParameter

P = myCommand.Parameters.Add("@FechaIni", SqlDbType.Int)
P.Value = FechaIni

P = New SqlParameter
P = myCommand.Parameters.Add("@FechaFin", SqlDbType.Int)
P.Value = FechaFin

Return myCommand.ExecuteReader

_IfError = False

Catch ex As Exception

_IfError = True
_ErrMsg = ex.Message

End Try

End If


End Function

End Class


Saludos Jorge Eldis










Preguntas similares