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:
Mostrar la cita
#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:
Mostrar la cita
#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:
Mostrar la cita
#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:
Mostrar la cita
Ads by Google
Search Busqueda sugerida