case

09/06/2005 - 19:13 por Eduardo De Luca | Informe spam
Alejandro , como siempre gracias por tu recomendaciones. No se si recordas,
pero siempre mis consultas van apuntadas a que estoy eliminando cursores de
los sp.

Como es que procesos que tardaban horas , pasan a tardar minutos eliminando
los cursores? , si bien se que SQL Server esta orientado a conjuntos de
datos y no a tratarlos individualmente, por ej., cuando recorre la tabla
para hacer un update ,como trabaja el motor ?, no genera un cursor
implícitamente para evaluar los registros.Si no es asi como recorre el lote
de registros.



El proceso que reescribí mas abajo (con el agregado de otras sentencias) ,
con cursores tardaba casi 3 horas , ahora paso a tardar menos de 2 minutos .
Si bien estoy mas que contento , sigo si entender la solución de fondo de
cómo trabaja el motor.

Acudo a tus conocimientos para que me puedas desasnar de este "misterio "
para mi ignorancia.



Para que te des una idea estoy trabajando con una base de 100 GB , donde el
promedio de las tablas son 80 millones de registros para arriba.



Saludos!
"Alejandro Mesa" <AlejandroMesa@discussions.microsoft.com> escribió en el
mensaje news:832D1B33-EFC2-47D5-A870-3F9A25E503D8@microsoft.com...

Eduardo,

Que bueno que se pudo resolver el problema, gracias a Liliana.

Una recomendación, y esta es que si la funcion dbo.e1_f_pasar_a_pesos() no
devuelve valor NULL (siempre devuelve un valor que puede ser cero o
diferente
a cero), entonces puedes usar "else" en las expresiones case y asi no se
llama a la funcion nuevamente. Algo asi como:

update
al_aut
set
v_cta_fec_vto > case
when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) <= 20 then null
else
case
when dbo.e1_f_pasar_a_pesos(v_desvio_anterior, v_cta_mon) > 20 then
(select e1_cuentas.cta_fec_vto FROM e1_cuentas WHERE
e1_cuentas.cta_id = al_aut.ctc_id)
else getdate()
end
end
go


Saludos,

AMB

"Eduardo De Luca" wrote:


Liliana, muchas Gracias , con la opcion 2 funciono perfecto , la uno no .
me diste una mano enorme porque me habia trabado en ese pedazo de codigo.
Saludos!!!
"Liliana Sorrentino" <lsorrentino@mardelplata.gov.ar> escribió en el
mensaje
news:uvf5FKFbFHA.1040@TK2MSFTNGP10.phx.gbl...
> Eduardo,
> Además del comentario de Alejandro sobre los dos primeros WHEN, hay un
> error
> de sintaxis que puede modificarse de dos maneras:
> 1, combinando las dos tablas:
>
> update al_aut set v_cta_fec_vto>> > case
> when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20 then
> null
> when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20 then
> case
> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
> v_cta_mon) > 20 then
> e1_cuentas.cta_fec_vto
> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
> v_cta_mon) <= 20 then
> getdate()
> end
> end
> from e1_cuentas
> where e1_cuentas .cta_id = alt_aut.ctc_id
>
> 2, con una subconsulta:
> update al_aut set v_cta_fec_vto>> > case
> when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20 then
> null
> when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20 then
> case
> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
> v_cta_mon) > 20 then
> (select e1_cuentas.cta_fec_vto from
> e1_cuentas
> where e1_cuentas .cta_id = alt_aut.ctc_id)
> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
> v_cta_mon) <= 20 then
> getdate()
> end
> end
>
>
> "Eduardo De Luca" <delucaeduardo@yahoo.com.ar> escribió en el mensaje
> news:##6OY2EbFHA.1600@tk2msftngp13.phx.gbl...
>> Alejandro , perdon va la correcion:
>>
>> update al_aut set v_cta_fec_vto>> >> case
>> when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20
>> then
> null
>> when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20 then
>> case
>> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> v_cta_mon) > 20 then
>> e1_cuentas.cta_fec_vto FROM e1_cuentas
>> WHERE
>> e1_cuentas .cta_id = alt_aut.ctc_id
>>
>> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> v_cta_mon) <= 20 then
>> getdate()
>> end
>>
>>
>> end
>>
>> fijate que si bien es la misma comparacion , la funcion recibe
>> distintos
>> parametros
>> GRacias
>>
>>
>>
>> "Alejandro Mesa" <AlejandroMesa@discussions.microsoft.com> escribió en
>> el
>> mensaje news:5836E88D-3E59-44F0-85C6-AF8876C2F6FB@microsoft.com...
>> > Eduardo,
>> >
>> > Pudieras reescribir la sentencia, parece que existe conflicto en el
> case.
>> >
>> >> update al_aut set v_cta_fec_vto>> >> >>
>> >> case
>> >>
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20
>> >> then
>> >> null
>> >>
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20
>> >> then
>> >
>> > La misma comparacion en diferentes "when".
>> >
>> > Otra cosa mas, pudieras poner el nombre de la tabla que corresponde
>> > a
> cada
>> > columna?
>> >
>> >> ### cta_fec_vto FROM e1_cuentas WHERE cta_id = ctc_id
>> >
>> > sera que cta_id y ctc_id pertenecen a la misma tabla?
>> >
>> >
>> > AMB
>> > "Eduardo De Luca" wrote:
>> >
>> >> Que tal . Les pido si alguno me puede ayudar .
>> >>
>> >> El codigo que escribo abajo estaba dentro de un cursor , y tardaba
>> >> bastante
>> >> (horas) lo elimine y este código se ejecuta en minutos . El único
>> >> problema
>> >> que se me presento en donde marco con el numeral (###)
>> >>
>> >> El equivalente en el cursor era
>> >>
>> >>
>> >>
>> >> .
>> >>
>> >> Update al_aut set v_cta_fec_vto = cta_fec_vto FROM e1_cuentas
>> >> WHERE
>> >> cta_id
>> >> =@variabledel cursor
>> >>
>> >> ..
>> >>
>> >> ...
>> >>
>> >> despues de eliminarlo :
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> update al_aut set v_cta_fec_vto>> >> >>
>> >> case
>> >>
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20
>> >> then
>> >> null
>> >>
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20
>> >> then
>> >>
>> >> case
>> >>
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> >> v_cta_mon)
>> >> > 20 then
>> >>
>> >> ### cta_fec_vto FROM e1_cuentas WHERE
>> >> cta_id >> >> >> ctc_id
>> >>
>> >>
>> >>
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> >> v_cta_mon)
>> >> <= 20 then
>> >>
>> >> getdate()
>> >>
>> >> end
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> end
>> >>
>> >>
>> >>
>> >> como el asigno ese valor en el case
>> >>
>> >> Gracias
>> >>
>> >>
>> >>
>>
>>
>
>



Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
09/06/2005 - 20:54 | Informe spam
http://support.microsoft.com/newsgr...sloc=en-us


AMB

"Eduardo De Luca" wrote:

Alejandro , como siempre gracias por tu recomendaciones. No se si recordas,
pero siempre mis consultas van apuntadas a que estoy eliminando cursores de
los sp.

Como es que procesos que tardaban horas , pasan a tardar minutos eliminando
los cursores? , si bien se que SQL Server esta orientado a conjuntos de
datos y no a tratarlos individualmente, por ej., cuando recorre la tabla
para hacer un update ,como trabaja el motor ?, no genera un cursor
implícitamente para evaluar los registros.Si no es asi como recorre el lote
de registros.



El proceso que reescribí mas abajo (con el agregado de otras sentencias) ,
con cursores tardaba casi 3 horas , ahora paso a tardar menos de 2 minutos .
Si bien estoy mas que contento , sigo si entender la solución de fondo de
cómo trabaja el motor.

Acudo a tus conocimientos para que me puedas desasnar de este "misterio "
para mi ignorancia.



Para que te des una idea estoy trabajando con una base de 100 GB , donde el
promedio de las tablas son 80 millones de registros para arriba.



Saludos!
"Alejandro Mesa" escribió en el
mensaje news:
> Eduardo,
>
> Que bueno que se pudo resolver el problema, gracias a Liliana.
>
> Una recomendación, y esta es que si la funcion dbo.e1_f_pasar_a_pesos() no
> devuelve valor NULL (siempre devuelve un valor que puede ser cero o
> diferente
> a cero), entonces puedes usar "else" en las expresiones case y asi no se
> llama a la funcion nuevamente. Algo asi como:
>
> update
> al_aut
> set
> v_cta_fec_vto > > case
> when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) <= 20 then null
> else
> case
> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior, v_cta_mon) > 20 then
> (select e1_cuentas.cta_fec_vto FROM e1_cuentas WHERE
> e1_cuentas.cta_id = al_aut.ctc_id)
> else getdate()
> end
> end
> go
>
>
> Saludos,
>
> AMB
>
> "Eduardo De Luca" wrote:
>
>> Liliana, muchas Gracias , con la opcion 2 funciono perfecto , la uno no .
>> me diste una mano enorme porque me habia trabado en ese pedazo de codigo.
>> Saludos!!!
>> "Liliana Sorrentino" escribió en el
>> mensaje
>> news:
>> > Eduardo,
>> > Además del comentario de Alejandro sobre los dos primeros WHEN, hay un
>> > error
>> > de sintaxis que puede modificarse de dos maneras:
>> > 1, combinando las dos tablas:
>> >
>> > update al_aut set v_cta_fec_vto> >> > case
>> > when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20 then
>> > null
>> > when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20 then
>> > case
>> > when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> > v_cta_mon) > 20 then
>> > e1_cuentas.cta_fec_vto
>> > when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> > v_cta_mon) <= 20 then
>> > getdate()
>> > end
>> > end
>> > from e1_cuentas
>> > where e1_cuentas .cta_id = alt_aut.ctc_id
>> >
>> > 2, con una subconsulta:
>> > update al_aut set v_cta_fec_vto> >> > case
>> > when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20 then
>> > null
>> > when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20 then
>> > case
>> > when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> > v_cta_mon) > 20 then
>> > (select e1_cuentas.cta_fec_vto from
>> > e1_cuentas
>> > where e1_cuentas .cta_id = alt_aut.ctc_id)
>> > when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> > v_cta_mon) <= 20 then
>> > getdate()
>> > end
>> > end
>> >
>> >
>> > "Eduardo De Luca" escribió en el mensaje
>> > news:##
>> >> Alejandro , perdon va la correcion:
>> >>
>> >> update al_aut set v_cta_fec_vto> >> >> case
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20
>> >> then
>> > null
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20 then
>> >> case
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> >> v_cta_mon) > 20 then
>> >> e1_cuentas.cta_fec_vto FROM e1_cuentas
>> >> WHERE
>> >> e1_cuentas .cta_id = alt_aut.ctc_id
>> >>
>> >> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> >> v_cta_mon) <= 20 then
>> >> getdate()
>> >> end
>> >>
>> >>
>> >> end
>> >>
>> >> fijate que si bien es la misma comparacion , la funcion recibe
>> >> distintos
>> >> parametros
>> >> GRacias
>> >>
>> >>
>> >>
>> >> "Alejandro Mesa" escribió en
>> >> el
>> >> mensaje news:
>> >> > Eduardo,
>> >> >
>> >> > Pudieras reescribir la sentencia, parece que existe conflicto en el
>> > case.
>> >> >
>> >> >> update al_aut set v_cta_fec_vto> >> >> >>
>> >> >> case
>> >> >>
>> >> >> when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20
>> >> >> then
>> >> >> null
>> >> >>
>> >> >> when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20
>> >> >> then
>> >> >
>> >> > La misma comparacion en diferentes "when".
>> >> >
>> >> > Otra cosa mas, pudieras poner el nombre de la tabla que corresponde
>> >> > a
>> > cada
>> >> > columna?
>> >> >
>> >> >> ### cta_fec_vto FROM e1_cuentas WHERE cta_id = ctc_id
>> >> >
>> >> > sera que cta_id y ctc_id pertenecen a la misma tabla?
>> >> >
>> >> >
>> >> > AMB
>> >> > "Eduardo De Luca" wrote:
>> >> >
>> >> >> Que tal . Les pido si alguno me puede ayudar .
>> >> >>
>> >> >> El codigo que escribo abajo estaba dentro de un cursor , y tardaba
>> >> >> bastante
>> >> >> (horas) lo elimine y este código se ejecuta en minutos . El único
>> >> >> problema
>> >> >> que se me presento en donde marco con el numeral (###)
>> >> >>
>> >> >> El equivalente en el cursor era
>> >> >>
>> >> >>
>> >> >>
>> >> >> .
>> >> >>
>> >> >> Update al_aut set v_cta_fec_vto = cta_fec_vto FROM e1_cuentas
>> >> >> WHERE
>> >> >> cta_id
>> >> >> =@variabledel cursor
>> >> >>
>> >> >> ..
>> >> >>
>> >> >> ...
>> >> >>
>> >> >> despues de eliminarlo :
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >> update al_aut set v_cta_fec_vto> >> >> >>
>> >> >> case
>> >> >>
>> >> >> when dbo.e1_f_pasar_a_pesos(v_desvio, v_cta_mon) > 20
>> >> >> then
>> >> >> null
>> >> >>
>> >> >> when dbo.e1_f_pasar_a_pesos(v_desvio,v_cta_mon) > 20
>> >> >> then
>> >> >>
>> >> >> case
>> >> >>
>> >> >> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> >> >> v_cta_mon)
>> >> >> > 20 then
>> >> >>
>> >> >> ### cta_fec_vto FROM e1_cuentas WHERE
>> >> >> cta_id > >> >> >> ctc_id
>> >> >>
>> >> >>
>> >> >>
>> >> >> when dbo.e1_f_pasar_a_pesos(v_desvio_anterior,
>> >> >> v_cta_mon)
>> >> >> <= 20 then
>> >> >>
>> >> >> getdate()
>> >> >>
>> >> >> end
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >> end
>> >> >>
>> >> >>
>> >> >>
>> >> >> como el asigno ese valor en el case
>> >> >>
>> >> >> Gracias
>> >> >>
>> >> >>
>> >> >>
>> >>
>> >>
>> >
>> >
>>
>>
>>




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