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

#1 Gustavo Larriera [MVP]
28/06/2006 - 20:40 | Informe spam
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
#2 Alejandro Mesa
28/06/2006 - 20:50 | Informe spam
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.

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.

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



Respuesta Responder a este mensaje
#3 SergioT
28/06/2006 - 20:56 | Informe spam
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
#4 Maxi
29/06/2006 - 01:22 | Informe spam
Sergio, te recomiendo que analices los planes de ejecucion, estoy viendo
varios OR y esto podria afectar el rendimiento, iigual revisa el plan de
ejecucion



Salu2

Micrsoft MVP SQL Server
www.sqlgururs.org


"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
#5 Gustavo Larriera [MVP]
29/06/2006 - 04:19 | Informe spam
Prueba a hacer EXEC sproc WITH RECOMPILE y ver si tienes mejor rendimiento?



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:
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida