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

#6 qwalgrande
29/06/2006 - 07:56 | Informe spam
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
#7 qwalgrande
29/06/2006 - 08:08 | Informe spam
Vaya, este lector de noticias que uso no me anidó todo el hilo y te he
soltado una parrafada a destiempo, sorry!

Bien, un tema importante que veo es que en un punto de la consulta, en las
comparaciones, realizas operaciones en el lado de los campos y no en el de
las variables. Me refiero exactamente a estas líneas:

AND (F.Ges*100+F.Ciclo >= @Desde AND F.Ges*100+F.Ciclo<=@Hasta)

Yo probaría a dejar de un lado de la igualdad aquel campo que esté indexado
y pondría todo lo demás al otro lado, es decir, si hay un índice cuyo primer
campo sea F.Ciclo:

AND (F.Ciclo >= @Desde - F.Ges*100 ...

Igual eso no aporta nada. ¿Podrías enviar cuántas lecturas hace de cada
tabla el sp (set statistics io on y luego ejecutas el sp)?

Alberto López Grande (qwalgrande)


"SergioT" escribió en el mensaje
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
#8 SergioT
29/06/2006 - 22:24 | Informe spam
hola

te cuento q nada no hay ,mejor rendimiento

alguna otra idea?

gracias
Salu2
Sergio


"Gustavo Larriera [MVP]" escribió en el mensaje
news:
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
#9 SergioT
29/06/2006 - 22:48 | Informe spam
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



Respuesta Responder a este mensaje
#10 SergioT
30/06/2006 - 00:36 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida