Auxilio!!!! un SP que tarda 7 minutos y da timeout

28/06/2006 - 19:16 por SergioT | Informe spam
Hola

Tengo un problema serio, tengo una consulta que corria bien en la base de
datos desde una clase en vb.net2003 en una aplicacion asp.net y ahora
derepente da timeout "Valor de tiempo de espera caducado. El periodode
tiempo de espera caducó antes de completar la operacion o el servidor no
responde"

lo curioso es que esa base de datos la coloco en mi notebook con msde y si
corro la aplicacion desde el VS2003 el resultado sale pero cuando la corro
en el server2003 da ese error, otra cosa curiosa es que he corrido la
consulta en el query analizer y tarda 7 minutos ( es un store procedure) y
luego corri la consulta sin Store procedure, directo en el query analizer y
tarda 14 segundos!!!! no entiendo nada , como puede ser que como SP tarde 7
minutos, que puedo hacer
HELP!!!!

Gracias
Sergio

Preguntas similare

Leer las respuestas

#11 qwalgrande
30/06/2006 - 07:27 | Informe spam
Hola.

¿Puedes enviarnos el plan de ejecución? Si estás usando management studio,
es un xml. Si no, puedes pasárnoslo en formato texto (ejecutando previamente
set showtextplan_on o algo así, mira en los BOL). También serían de utilidad
saber el número de lecturas (ejecutando previamente set statistics io on).

Alberto López Grande (qwalgrande)


"SergioT" escribió en el mensaje
news:
hola

te cuento lo q hice

puse una bd en la que el SP funciona, es una copia que la tenia en mi
notebook con xp y ahi funciona, y nada
elimine la base de datos de servidor y restaure una copia que si
funcionaba y nada
le hice el with recompile y nada

que demonios puede ser que funque en la notebook en msde y no en el
server????? la misma base de datos!!!

Esto esta jodidisimo no hallo salida

AGRADESCO CUALQUIER AYUDA!!!!
Salu2
Sergio

"qwalgrande" escribió en el mensaje
news:
Hola.

Una de las grandes ventajas de los procedimientos almacenados es que se
compilan la primera vez que se ejecutan y el resto de veces se utiliza
siempre el mismo plan de ejecución que se usó la primera vez. Pero claro,
ese plan de ejecución ha de ser tal que sea válido con cualquier
combinación posible de parámetros. Si en esa primera ejecución los
parámetros provocaron que se eligiera un plan de ejecución que no fuera
muy adecuado, el sp irá siempre mal.

Observa el plan de ejecución del sp, y compáralo con el de la consulta.
Si ves que son muy diferentes, modifica el sp para que se recompile en su
próxima ejecución y ejecútalo tú con unos parámetros que sean los más
típicos en la aplicación. Si aún así va mal, puedes incluirle la cláusula
"with recompile" para que se compile en cada ejecución (mira en los BOL).

Si quieres, puedes enviarnos el código, quizá podamos precisarte más qué
podrías hacer para mejorar el rendimiento.

Alberto López Grande (qwalgrande)


"SergioT" escribió en el mensaje
news:%
Hola

Tengo un problema serio, tengo una consulta que corria bien en la base
de datos desde una clase en vb.net2003 en una aplicacion asp.net y ahora
derepente da timeout "Valor de tiempo de espera caducado. El periodode
tiempo de espera caducó antes de completar la operacion o el servidor no
responde"

lo curioso es que esa base de datos la coloco en mi notebook con msde y
si corro la aplicacion desde el VS2003 el resultado sale pero cuando la
corro en el server2003 da ese error, otra cosa curiosa es que he corrido
la consulta en el query analizer y tarda 7 minutos ( es un store
procedure) y luego corri la consulta sin Store procedure, directo en el
query analizer y tarda 14 segundos!!!! no entiendo nada , como puede ser
que como SP tarde 7 minutos, que puedo hacer
HELP!!!!

Gracias
Sergio









Respuesta Responder a este mensaje
#12 Javier Loria
30/06/2006 - 12:24 | Informe spam
Hola Sergio:
Podrias tratar de eliminar la subquery de bCiclo?:
==SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER PROCEDURE dbo.bSelFact
(
@Suc as smallint,
@Oficina as smallint,
@Ges as int,
@Ciclo as smallint,
@JefeGrupo as int,
@CodPer as int
)
AS
Set NOCOUNT ON
Declare @Desde int
Declare @Hasta int
Set @Hasta=@Ges*100+@Ciclo
Set @Desde=@Ciclo -7
if @Desde<=0
BEGIN
Set @Desde = (SELECT coalesce(max(Ciclo),0) FROM bCiclo WHERE Ges=@Ges-1 )
+@Desde
Set @Desde = (@Ges-1)*100+@Desde
END
ELSE
Set @Desde = @Ges*100 + @Desde
-Obtiene la fecha maxima del ciclo pedido
Declare @dFecMax datetime
Set @dFecMax=(SELECT Hasta FROM bCiclo WHERE Ges=@Ges AND Ciclo=@Ciclo)
SELECT
Y.CodSuc,Y.NomSuc,Y.CodOficina,Y.NomOficina,Y.CodGrupo,Y.CodJefeGrupo,Y.NombreJefe,
Y.CodPer,Y.CodPerUsr,Y.NombreCompleto,Y.Telefono,Y.FecNac,Y.Fec_Incor,Y.CantCamp,X.Ges,X.Ciclo,
D.Saldo as
Deuda,D.LineaCredito,X.CanPed,X.CanItems,X.CanMatProm,X.Neto,X.ValPpub,Y.DireccionCorreo
FROM (SELECT
G.CodSuc,G.NomSuc,G.CodOficina,G.NomOficina,G.CodGrupo,G.CodJefeGrupo,
G.NombreJefe,G.CodPer,G.CodPerUsr,G.NombreCompleto,G.DirDomCalle as
DireccionCorreo,
ltrim(G.TelDom)+'/'+ltrim(G.TelCel) as Telefono,G.FecNac,G.Fec_Incor,
COUNT(*)
FROM vGrupos as G
FROM bCiclo
ON bCiclo.Ges<@Ges
AND bCiclo.Ciclo<=@Ciclo
AND bCiclo.Hasta-G.Fec_Incor
WHERE (G.CodSuc=@Suc OR @Suc=0)
AND (G.CodOficina=@Oficina OR @Oficina=0)
AND (G.CodJefeGrupo = @JefeGrupo OR @JefeGrupo=0)
AND (G.CodPer = @CodPer OR @CodPer=0)
GROUP BY
G.CodSuc,G.NomSuc,G.CodOficina,G.NomOficina,G.CodGrupo,G.CodJefeGrupo,
G.NombreJefe,G.CodPer,G.CodPerUsr,G.NombreCompleto,G.DirDomCalle,
ltrim(G.TelDom)+'/'+ltrim(G.TelCel),G.FecNac, G.Fec_Incor) as Y
INNER JOIN (SELECT F.CodCli,F.Ges,F.Ciclo,count(F.IdFactura) as CanPed,
sum(F.CanItems)as CanItems,sum(F.CanMatProm) as CanMatProm,
sum(F.Neto) as Neto,sum(F.ValPpub) as ValPpub
FROM bFactura as F
WHERE (F.Codcli = @CodPer OR @CodPer = 0)
AND (F.Ges*100+F.Ciclo >= @Desde AND F.Ges*100+F.Ciclo<=@Hasta)
GROUP BY F.CodCli,F.Ges,F.Ciclo) AS X
ON Y.CodPer=X.CodCli
INNER JOIN (SELECT CodCli,Saldo,LineaCredito
FROM vClienteDeuda
WHERE (CodSuc=@Suc OR @Suc=0)
AND (CodOficina=@Oficina OR @Oficina=0)
AND (Codcli=@CodPer or @CodPer=0)) as D
ON Y.CodPer=D.CodCli
ORDER BY Y.NomSuc,Y.NomOficina,Y.NombreJefe,Y.NombreCompleto,X.Ges,X.Ciclo
== Suerte,


Javier Loria
Costa Rica

"SergioT" wrote in message
news:
claro ahi va

es un poco complejo usa varias vistas de tablas grandes pero como t digo
funcionaba bien hasta hace 2 dias y la cosa es q dependo de el para muchos
informes!!! lo raro es que si lo ejecuto del QueryAnalizer tarda 7 minutos
cuando lo corro en mi maquina corriendo la Aplicacion desde el visual
studio2003 funciona bien y por ultimo si corro la consulta "escrita" en el
queryAnalizer no como SP tarda 14 segundos


ahi va el codigo


SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

ALTER PROCEDURE dbo.bSelFact
(
@Suc as smallint,
@Oficina as smallint,
@Ges as int,
@Ciclo as smallint,
@JefeGrupo as int,
@CodPer as int
)
AS
Set NOCOUNT ON

Declare @Desde int
Declare @Hasta int

Set @Hasta=@Ges*100+@Ciclo
Set @Desde=@Ciclo -7
if @Desde<=0
BEGIN
Set @Desde = (SELECT coalesce(max(Ciclo),0) FROM bCiclo WHERE
Ges=@Ges-1 ) +@Desde
Set @Desde = (@Ges-1)*100+@Desde
END
ELSE
Set @Desde = @Ges*100 + @Desde
-Obtiene la fecha maxima del ciclo pedido
Declare @dFecMax datetime
Set @dFecMax=(SELECT Hasta FROM bCiclo WHERE Ges=@Ges AND Ciclo=@Ciclo)


SELECT
Y.CodSuc,Y.NomSuc,Y.CodOficina,Y.NomOficina,Y.CodGrupo,Y.CodJefeGrupo,Y.NombreJefe,

Y.CodPer,Y.CodPerUsr,Y.NombreCompleto,Y.Telefono,Y.FecNac,Y.Fec_Incor,Y.CantCamp,X.Ges,X.Ciclo,
D.Saldo as
Deuda,D.LineaCredito,X.CanPed,X.CanItems,X.CanMatProm,X.Neto,X.ValPpub,Y.DireccionCorreo
FROM (SELECT
G.CodSuc,G.NomSuc,G.CodOficina,G.NomOficina,G.CodGrupo,G.CodJefeGrupo,
G.NombreJefe,G.CodPer,G.CodPerUsr,G.NombreCompleto,G.DirDomCalle as
DireccionCorreo,
ltrim(G.TelDom)+'/'+ltrim(G.TelCel) as Telefono,G.FecNac,G.Fec_Incor,
(SELECT count(Ciclo) FROM bCiclo where (Ges<=@Ges and Ciclo<=@Ciclo) and
Hasta>=G.Fec_Incor) as CantCamp
FROM vGrupos as G
WHERE (G.CodSuc=@Suc OR @Suc=0)
AND (G.CodOficina=@Oficina OR @Oficina=0)
AND (G.CodJefeGrupo = @JefeGrupo OR @JefeGrupo=0)
AND (G.CodPer = @CodPer OR @CodPer=0)) as Y
INNER JOIN (SELECT F.CodCli,F.Ges,F.Ciclo,count(F.IdFactura) as CanPed,
sum(F.CanItems)as CanItems,sum(F.CanMatProm) as CanMatProm,
sum(F.Neto) as Neto,sum(F.ValPpub) as ValPpub
FROM bFactura as F
WHERE (F.Codcli = @CodPer OR @CodPer = 0)
AND (F.Ges*100+F.Ciclo >= @Desde AND F.Ges*100+F.Ciclo<=@Hasta)
GROUP BY F.CodCli,F.Ges,F.Ciclo) AS X
ON Y.CodPer=X.CodCli
INNER JOIN (SELECT CodCli,Saldo,LineaCredito
FROM vClienteDeuda
WHERE (CodSuc=@Suc OR @Suc=0)
AND (CodOficina=@Oficina OR @Oficina=0)
AND (Codcli=@CodPer or @CodPer=0)) as D
ON Y.CodPer=D.CodCli
ORDER BY Y.NomSuc,Y.NomOficina,Y.NombreJefe,Y.NombreCompleto,X.Ges,X.Ciclo

RETURN

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

GRACIAS
SERGIO




"Gustavo Larriera [MVP]" escribió en el mensaje
news:
Puedes mostrar el código de ese stored procedure?

Gustavo Larriera, MVP SQL
Uruguay LatAm
Blog: http://sqljunkies.com/weblog/gux/
MVP profile: http://aspnet2.com/mvp.ashx?GustavoLarriera
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and
confers no rights.

"SergioT" wrote in message
news:%
Hola

Tengo un problema serio, tengo una consulta que corria bien en la base
de datos desde una clase en vb.net2003 en una aplicacion asp.net y ahora
derepente da timeout "Valor de tiempo de espera caducado. El periodode
tiempo de espera caducó antes de completar la operacion o el servidor no
responde"

lo curioso es que esa base de datos la coloco en mi notebook con msde y
si corro la aplicacion desde el VS2003 el resultado sale pero cuando la
corro en el server2003 da ese error, otra cosa curiosa es que he corrido
la consulta en el query analizer y tarda 7 minutos ( es un store
procedure) y luego corri la consulta sin Store procedure, directo en el
query analizer y tarda 14 segundos!!!! no entiendo nada , como puede ser
que como SP tarde 7 minutos, que puedo hacer
HELP!!!!

Gracias
Sergio









Respuesta Responder a este mensaje
#13 Alejandro Mesa
30/06/2006 - 13:44 | Informe spam
SergioT,

Tienes el mismo service pack instalado en ambas maquinas?

Trata de capturar el plan de ejecucion en cada maquina para ver las
diferencias.


AMB


"SergioT" wrote:



Hola Alejandro

Me podrias decir como quequear que las referencias a los indices esten OK?

ya lo destrui lo corri cree de nuevo y nada ya no se q hacer esto esta
desesperante

gracias por tu ayuda

"Alejandro Mesa" escribió en el
mensaje news:
> SergioT,
>
> 1 - Chequea que las estadisticas de los indices de las tablas
> referenciadas
> en el sp, esten actualizadas.
>
> 2 - Puede que tu sp este sufriendo de algo que es conocido, en ingles,
> como
> "parameter sniffing". Este problema se da cuando SQL Server genera un plan
> de
> ejecucion basado en un valor no tipico (muchas ocurrencias) de la columna
> que
> conforma el indice. Si despues usamos valores tipicos, SQL Server seguira
> usando el plan que esta en cache. Lo mismo puede pasar en forma inversa,
> SQL
> Server crea el plan de ejecucion basado en un valor tipico y luego vemos
> demoras cuando se pasan valores no tipicos. Una forma de evitar esto es
> obligando a SQL server a no mantener el plan de ejecucion en el cache,
> creando el sp con la opcion "with recompile" o ejecutando el sp con la
> misma
> opcion. Este metodo es recomendado cuando la recompilacion no toma tanto
> tiempo comparada con el tiempo de ejecucion. Otra forma es usar variables
> intermedias, a las cuales se le asignan los valores de los parametros y
> estan
> son usadas en la expresion del filtro.
>
> Aca les paso un ejemplo donde reproduzco el problema. En la primera
> ejecucion, pasamos un valor tipico, SQL Server escoje un plan de ejecucion
> usando un "index seek". Cuando lo ejecutamos la segunda vez con un valor
> no
> tipico, SQL Server reusa el plan y como veran, el costo de usar el indice
> es
> mayor que el de escanear la tablas.
>
> corrida)
> Table 't1'. Scan count 1, logical reads 4, physical reads 0, read-ahead
> reads 0.
>
> corrida)
> Table 't1'. Scan count 1, logical reads 885, physical reads 0, read-ahead
> reads 0.
>
> corrida)
> Table 't1'. Scan count 1, logical reads 400894, physical reads 0,
> read-ahead
> reads 0.
>
> corrida)
> Table 't1'. Scan count 1, logical reads 885, physical reads 0, read-ahead
> reads 880.
>
>
> Table 't1'. Scan count 1, logical reads 885, physical reads 0, read-ahead
> reads 880.
>
> Table 't1'. Scan count 1, logical reads 4, physical reads 2, read-ahead
> reads 0.
>
>
> Ejemplo:
>
> use northwind
> go
>
> create table dbo.t1 (
> c1 int not null identity,
> c2 int
> )
> go
>
> set nocount on
>
> insert into t1(c2)
> select orderid
> from dbo.orders
>
> set nocount off
> go
>
> set nocount on
>
> declare @i int
>
> set @i = 400000
>
> while @i > 0
> begin
> insert into t1(c2) values(10250)
>
> set @i = @i - 1
> end
>
> set nocount off
> go
>
> create nonclustered index t1_c2_nu_nc_idx on dbo.t1(c2)
> go
>
> create procedure dbo.p1
> @c2 int
> as
> set nocount on
>
> select c1, c2
> from dbo.t1
> where c2 = @c2
> go
>
> SET STATISTICS IO ON
> SET STATISTICS PROFILE ON
> go
>
> exec dbo.p1 10248
> go
>
> exec dbo.p1 10250
> go
>
> SET STATISTICS IO OFF
> SET STATISTICS PROFILE OFF
> go
>
> dbcc freeproccache
> dbcc dropcleanbuffers
> go
>
> SET STATISTICS IO ON
> SET STATISTICS PROFILE ON
> go
>
> exec dbo.p1 10250
> go
>
> exec dbo.p1 10248
> go
>
> SET STATISTICS IO OFF
> SET STATISTICS PROFILE OFF
> go
>
> dbcc freeproccache
> dbcc dropcleanbuffers
> go
>
> SET STATISTICS IO ON
> SET STATISTICS PROFILE ON
> go
>
> exec dbo.p1 10250 with recompile
> go
>
> exec dbo.p1 10248 with recompile
> go
>
> SET STATISTICS IO OFF
> SET STATISTICS PROFILE OFF
> go
>
> drop procedure dbo.p1
> go
>
> drop table dbo.t1
> go
>
>
> Estadísticas de distribución en SQL Server 2000 (I)
> http://www.helpdna.net/colab02.htm
>
>
> AMB
>
> "SergioT" wrote:
>
>> Hola
>>
>> Tengo un problema serio, tengo una consulta que corria bien en la base de
>> datos desde una clase en vb.net2003 en una aplicacion asp.net y ahora
>> derepente da timeout "Valor de tiempo de espera caducado. El periodode
>> tiempo de espera caducó antes de completar la operacion o el servidor no
>> responde"
>>
>> lo curioso es que esa base de datos la coloco en mi notebook con msde y
>> si
>> corro la aplicacion desde el VS2003 el resultado sale pero cuando la
>> corro
>> en el server2003 da ese error, otra cosa curiosa es que he corrido la
>> consulta en el query analizer y tarda 7 minutos ( es un store procedure)
>> y
>> luego corri la consulta sin Store procedure, directo en el query
>> analizer y
>> tarda 14 segundos!!!! no entiendo nada , como puede ser que como SP tarde
>> 7
>> minutos, que puedo hacer
>> HELP!!!!
>>
>> Gracias
>> Sergio
>>
>>
>>



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