optimizacion de un proceso en cursores

24/11/2004 - 00:27 por jdonis2002 | Informe spam
hola,
el problema es que tengo que un proceso en SP el cual tengo que optimizar
debido a que se esta tomando casi 4 horas en ejecutar.

basicamente el proceso debe prorratear los servicios realizados por un
trabajador dentro de los dias indicados.
para prorratear debo sumarizar por fecha lo debengado y distribuirlo dentro
de los servicios realizados.

tengo 2 cursores. el primero me identifica los dias ordinarios sobre los
que tengo que distribuir los servicios. el segundo obtiene el monto a
distribuir por fecha.




o domingos
declare cur_participar cursor fast_forward for
select codemp, sum(isnull(cantidad,0)) as diasOrd
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and codcsr = 15
and codgsr = 1
and codsrv = 1
group by fecha, codemp
for read only

open cur_participar
fetch next from cur_participar into @codemp, @diasOrd
while @@fetch_status = 0
begin

if @diasord > 0 begin
declare cur_procesa cursor fast_forward for

select fecha, sum(isnull(cantidad,0))
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and codcsr = 1
and codgsr = 2
group by fecha
for read only

set @contador = 0

open cur_procesa
fetch next from cur_procesa into @fecha, @cantidad
while @@fetch_status = 0
begin

realizados por dia.
update detser_serv set segmen01 = convert(decimal(10,2), ( 1 / @cantidad
) * cantidad )
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and fecha = @fecha
and codemp = isnull(@codemp, dse_codemp)
and codcsr = 1
and codgsr = 2

set @contador = @contador + 1

existentes trabajados.
ingresados.
if @contador >= @diasOrd break

fetch next from cur_procesa into @fecha, @cantidad
end
close cur_procesa
deallocate cur_procesa
end

fetch next from cur_participar into @codemp, @diasOrd, @diasFer
end
close cur_participar
deallocate cur_participar

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
24/11/2004 - 13:39 | Informe spam
Hola,
Podrías mandar la esctructura de las tablas SIMPLIFICADA, con ejemplos de
datos de entrada y el resultado esperado?
Liliana.

"jdonis2002" escribió en el mensaje
news:
hola,
el problema es que tengo que un proceso en SP el cual tengo que optimizar
debido a que se esta tomando casi 4 horas en ejecutar.

basicamente el proceso debe prorratear los servicios realizados por un
trabajador dentro de los dias indicados.
para prorratear debo sumarizar por fecha lo debengado y distribuirlo


dentro
de los servicios realizados.

tengo 2 cursores. el primero me identifica los dias ordinarios sobre los
que tengo que distribuir los servicios. el segundo obtiene el monto a
distribuir por fecha.






feriados
o domingos
declare cur_participar cursor fast_forward for
select codemp, sum(isnull(cantidad,0)) as diasOrd
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and codcsr = 15
and codgsr = 1
and codsrv = 1
group by fecha, codemp
for read only

open cur_participar
fetch next from cur_participar into @codemp, @diasOrd
while @@fetch_status = 0
begin

if @diasord > 0 begin
declare cur_procesa cursor fast_forward for

select fecha, sum(isnull(cantidad,0))
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and codcsr = 1
and codgsr = 2
group by fecha
for read only

set @contador = 0

open cur_procesa
fetch next from cur_procesa into @fecha, @cantidad
while @@fetch_status = 0
begin

realizados por dia.
update detser_serv set segmen01 = convert(decimal(10,2), ( 1 / @cantidad
) * cantidad )
from servicio_realizado with ( nolock )
join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
codsre = codigo
where codcia = @codcia
and codtpl = @codtpl
and codpla = @codpla
and fecha = @fecha
and codemp = isnull(@codemp, dse_codemp)
and codcsr = 1
and codgsr = 2

set @contador = @contador + 1

existentes trabajados.
ingresados.
if @contador >= @diasOrd break

fetch next from cur_procesa into @fecha, @cantidad
end
close cur_procesa
deallocate cur_procesa
end

fetch next from cur_participar into @codemp, @diasOrd, @diasFer
end
close cur_participar
deallocate cur_participar



Respuesta Responder a este mensaje
#2 jdonis2002
25/11/2004 - 16:37 | Informe spam
Gracias Liliana...
encontre el problema
basicamente se encontraba en el segundo cursor.
la linea que tenia anteriormente era:
and codemp = isnull(@codemp, dse_codemp)

cambiando la linea a:
and codemp = @codemp

cambio el tiempo de ejecucion de mi proceso de casi 4 horas a 1 minuto 20
segundos, trabajando 180000 registros.
el problema era que con la sentencia anterior iba validando cada registro de
los 180000 existentes para ver si era nulo, y esto lo hacia por cada vez que
pasaba sobre el segundo cursor por lo que le tomaba un mundo
si la condicion anterior solamente obtengo los registros que necesito y
proceso unicamente sobre ellos.


siempre muchas gracias =)






"Liliana Sorrentino" escribió:

Hola,
Podrías mandar la esctructura de las tablas SIMPLIFICADA, con ejemplos de
datos de entrada y el resultado esperado?
Liliana.

"jdonis2002" escribió en el mensaje
news:
> hola,
> el problema es que tengo que un proceso en SP el cual tengo que optimizar
> debido a que se esta tomando casi 4 horas en ejecutar.
>
> basicamente el proceso debe prorratear los servicios realizados por un
> trabajador dentro de los dias indicados.
> para prorratear debo sumarizar por fecha lo debengado y distribuirlo
dentro
> de los servicios realizados.
>
> tengo 2 cursores. el primero me identifica los dias ordinarios sobre los
> que tengo que distribuir los servicios. el segundo obtiene el monto a
> distribuir por fecha.
>
>
>
>
feriados
> o domingos
> declare cur_participar cursor fast_forward for
> select codemp, sum(isnull(cantidad,0)) as diasOrd
> from servicio_realizado with ( nolock )
> join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
> codsre = codigo
> where codcia = @codcia
> and codtpl = @codtpl
> and codpla = @codpla
> and codcsr = 15
> and codgsr = 1
> and codsrv = 1
> group by fecha, codemp
> for read only
>
> open cur_participar
> fetch next from cur_participar into @codemp, @diasOrd
> while @@fetch_status = 0
> begin
>
> if @diasord > 0 begin
> declare cur_procesa cursor fast_forward for
>
> select fecha, sum(isnull(cantidad,0))
> from servicio_realizado with ( nolock )
> join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
> codsre = codigo
> where codcia = @codcia
> and codtpl = @codtpl
> and codpla = @codpla
> and codcsr = 1
> and codgsr = 2
> group by fecha
> for read only
>
> set @contador = 0
>
> open cur_procesa
> fetch next from cur_procesa into @fecha, @cantidad
> while @@fetch_status = 0
> begin
>
> realizados por dia.
> update detser_serv set segmen01 = convert(decimal(10,2), ( 1 / @cantidad
> ) * cantidad )
> from servicio_realizado with ( nolock )
> join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha and
> codsre = codigo
> where codcia = @codcia
> and codtpl = @codtpl
> and codpla = @codpla
> and fecha = @fecha
> and codemp = isnull(@codemp, dse_codemp)
> and codcsr = 1
> and codgsr = 2
>
> set @contador = @contador + 1
>
> existentes trabajados.
> ingresados.
> if @contador >= @diasOrd break
>
> fetch next from cur_procesa into @fecha, @cantidad
> end
> close cur_procesa
> deallocate cur_procesa
> end
>
> fetch next from cur_participar into @codemp, @diasOrd, @diasFer
> end
> close cur_participar
> deallocate cur_participar
>
>
>



Respuesta Responder a este mensaje
#3 Liliana Sorrentino
25/11/2004 - 17:00 | Informe spam
Hola,
No sé si ponerme contenta con tu respuesta, hubiese preferido que la
solución la encontraras dejando de lado los curs...(esta mano que se resiste
a escribir la palabra completa), pero bueno, ya es la segunda conversación
de este tipo en el día, suficiente para mí.
Fuera de broma, me alegro que hayan bajado tus tiempos de proceso, aunque no
dejaría de buscar la manera (que la hay seguramente) de armar ese query de
otra manera.
Saludos!
Liliana.

"jdonis2002" escribió en el mensaje
news:
Gracias Liliana...
encontre el problema
basicamente se encontraba en el segundo cursor.
la linea que tenia anteriormente era:
and codemp = isnull(@codemp, dse_codemp)

cambiando la linea a:
and codemp = @codemp

cambio el tiempo de ejecucion de mi proceso de casi 4 horas a 1 minuto 20
segundos, trabajando 180000 registros.
el problema era que con la sentencia anterior iba validando cada registro


de
los 180000 existentes para ver si era nulo, y esto lo hacia por cada vez


que
pasaba sobre el segundo cursor por lo que le tomaba un mundo
si la condicion anterior solamente obtengo los registros que necesito y
proceso unicamente sobre ellos.


siempre muchas gracias =)






"Liliana Sorrentino" escribió:

> Hola,
> Podrías mandar la esctructura de las tablas SIMPLIFICADA, con ejemplos


de
> datos de entrada y el resultado esperado?
> Liliana.
>
> "jdonis2002" escribió en el


mensaje
> news:
> > hola,
> > el problema es que tengo que un proceso en SP el cual tengo que


optimizar
> > debido a que se esta tomando casi 4 horas en ejecutar.
> >
> > basicamente el proceso debe prorratear los servicios realizados por un
> > trabajador dentro de los dias indicados.
> > para prorratear debo sumarizar por fecha lo debengado y distribuirlo
> dentro
> > de los servicios realizados.
> >
> > tengo 2 cursores. el primero me identifica los dias ordinarios sobre


los
> > que tengo que distribuir los servicios. el segundo obtiene el monto


a
> > distribuir por fecha.
> >
> >
> >
> >
> feriados
> > o domingos
> > declare cur_participar cursor fast_forward for
> > select codemp, sum(isnull(cantidad,0)) as diasOrd
> > from servicio_realizado with ( nolock )
> > join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha


and
> > codsre = codigo
> > where codcia = @codcia
> > and codtpl = @codtpl
> > and codpla = @codpla
> > and codcsr = 15
> > and codgsr = 1
> > and codsrv = 1
> > group by fecha, codemp
> > for read only
> >
> > open cur_participar
> > fetch next from cur_participar into @codemp, @diasOrd
> > while @@fetch_status = 0
> > begin
> >
> > if @diasord > 0 begin
> > declare cur_procesa cursor fast_forward for
> >
> > select fecha, sum(isnull(cantidad,0))
> > from servicio_realizado with ( nolock )
> > join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha


and
> > codsre = codigo
> > where codcia = @codcia
> > and codtpl = @codtpl
> > and codpla = @codpla
> > and codcsr = 1
> > and codgsr = 2
> > group by fecha
> > for read only
> >
> > set @contador = 0
> >
> > open cur_procesa
> > fetch next from cur_procesa into @fecha, @cantidad
> > while @@fetch_status = 0
> > begin
> >


servicios
> > realizados por dia.
> > update detser_serv set segmen01 = convert(decimal(10,2), ( 1 /


@cantidad
> > ) * cantidad )
> > from servicio_realizado with ( nolock )
> > join detser_serv with ( nolock ) on codcia = codcia and fecha = fecha


and
> > codsre = codigo
> > where codcia = @codcia
> > and codtpl = @codtpl
> > and codpla = @codpla
> > and fecha = @fecha
> > and codemp = isnull(@codemp, dse_codemp)
> > and codcsr = 1
> > and codgsr = 2
> >
> > set @contador = @contador + 1
> >
> > existentes trabajados.


dias
> > ingresados.
> > if @contador >= @diasOrd break
> >
> > fetch next from cur_procesa into @fecha, @cantidad
> > end
> > close cur_procesa
> > deallocate cur_procesa
> > end
> >
> > fetch next from cur_participar into @codemp, @diasOrd, @diasFer
> > end
> > close cur_participar
> > deallocate cur_participar
> >
> >
> >
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida