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

Preguntas similare

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










Respuesta Responder a este mensaje
#2 Jorge Eldis
31/10/2004 - 04:17 | Informe spam
Héctor Muchas gracias,



Me parece muy buenas las observaciones que me has dado pero tengo este
problema donde me dices que hay un problema de diseño te explico que pasa



La tabla de llamadas las saco de una central telefónica por lo que solo
tengo el numero marcado y no tengo manera de tener un campo con el Código de
Área por eso he tenido que recurrir a substring para sacar el Código de
Área.



Que me sugieres que haga en este caso?



Muchas gracias por tu ayuda.



Saludos Jorge Eldis


"Hector Bejarano" wrote in message
news:
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














Respuesta Responder a este mensaje
#3 Hector Bejarano
31/10/2004 - 04:36 | Informe spam
En realidad depende mucho del metodo que utilices para cargar la tabla, te
puedo dar estas 2 recomendaciones:

1. Si estas haciendo un bulk copy, un dts, o algo que llene directamente la
tabla, te recomiendo que igual crees el campo, y que lo llenes cuando
realizas la carga mediante una columna derivada (como la que utilizas en tu
select) si fuera posible.

2. Otra solucion menos recomendada pero igual de efectiva seria crear un
trigger que actualice la informacion del campo con los datos correctos, te
digo que es menos recomendada por que seria mas lenta que la anterior a la
hora de insertar los campos.

Si te decides por la segunda, recuerda hacer los indices, ya que muy
probablemente los vas a utilizar intensivamente, y si estas tablas se vacian
diariamente, recuerda que las estructuras de los indices tambien afectaran
el rendimiento a la hora de hacer la insercion.

Si el desempeno se viera muy afectado a la hora de hacer la carga de los
datos, te sugiero crear una tabla temporal en la cual cargas los datos,
luego borras la anterior, y finalmente renombras la que acabas de crear para
terminar recreando los indices y relaciones.

Existen diversas formas de mejorar el rendimiento del SQL Server, te
recomiendo este link:

http://www.sql-server-performance.com/

Posee informacion valiosa que muy probablemente podras aplicar.

Saludos,
Hector Bejarano.

"Jorge Eldis" wrote in message
news:
Héctor Muchas gracias,



Me parece muy buenas las observaciones que me has dado pero tengo este
problema donde me dices que hay un problema de diseño te explico que pasa



La tabla de llamadas las saco de una central telefónica por lo que solo
tengo el numero marcado y no tengo manera de tener un campo con el Código
de Área por eso he tenido que recurrir a substring para sacar el Código de
Área.



Que me sugieres que haga en este caso?



Muchas gracias por tu ayuda.



Saludos Jorge Eldis


"Hector Bejarano" wrote in message
news:
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


















Respuesta Responder a este mensaje
#4 Jorge Eldis
31/10/2004 - 16:47 | Informe spam
Gracias una vez mas Hector, entiendo claramante el mensaje, es mejor crear
el digito cada vez que inserto un registro que tener que buscar el digito
seleccionando mucha cantidad de registros con el metodo que usaba, de esta
manera puedo relacionar la tabla de llamadas con la de codigos y seria mucho
mas eficiente, tambien los Indices que no los tenia creado.


Saludos Jorge Eldis

"Hector Bejarano" wrote in message
news:
En realidad depende mucho del metodo que utilices para cargar la tabla, te
puedo dar estas 2 recomendaciones:

1. Si estas haciendo un bulk copy, un dts, o algo que llene directamente
la tabla, te recomiendo que igual crees el campo, y que lo llenes cuando
realizas la carga mediante una columna derivada (como la que utilizas en
tu select) si fuera posible.

2. Otra solucion menos recomendada pero igual de efectiva seria crear un
trigger que actualice la informacion del campo con los datos correctos, te
digo que es menos recomendada por que seria mas lenta que la anterior a la
hora de insertar los campos.

Si te decides por la segunda, recuerda hacer los indices, ya que muy
probablemente los vas a utilizar intensivamente, y si estas tablas se
vacian diariamente, recuerda que las estructuras de los indices tambien
afectaran el rendimiento a la hora de hacer la insercion.

Si el desempeno se viera muy afectado a la hora de hacer la carga de los
datos, te sugiero crear una tabla temporal en la cual cargas los datos,
luego borras la anterior, y finalmente renombras la que acabas de crear
para terminar recreando los indices y relaciones.

Existen diversas formas de mejorar el rendimiento del SQL Server, te
recomiendo este link:

http://www.sql-server-performance.com/

Posee informacion valiosa que muy probablemente podras aplicar.

Saludos,
Hector Bejarano.

"Jorge Eldis" wrote in message
news:
Héctor Muchas gracias,



Me parece muy buenas las observaciones que me has dado pero tengo este
problema donde me dices que hay un problema de diseño te explico que pasa



La tabla de llamadas las saco de una central telefónica por lo que solo
tengo el numero marcado y no tengo manera de tener un campo con el Código
de Área por eso he tenido que recurrir a substring para sacar el Código
de Área.



Que me sugieres que haga en este caso?



Muchas gracias por tu ayuda.



Saludos Jorge Eldis


"Hector Bejarano" wrote in message
news:
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






















email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida