El día 9 de febrero de 2009 7:08, Raúl Andrés Duque Murillo
<[email protected]> escribió:
> Cordial saludo compañeros.
>
> Quisiera saber si a alguien se le ocurre una solución a este problema.
>
> Tengo un proceso que actualiza datos en una tabla basado en valores de otra
> tabla. Actualmente lo realizo DESDE LA APLICACION recorriendo la tabla base
> y por cada registro realizo una actualización en la tabla a actualizar, pero
> es MUY demorado por la cantidad de datos que actualmente se maneja y ahora
> quiero hacerlo desde la DB (pl/pgsql) y "set-oriented".
>

Es poco practico recorrer siempre toda una tabla.
te conviene hacerlo una vez sola y preparar una rule
after update-insert-detete para la tabla original y que
repita esa operacion sobre la otra tabla.


> Más o menos el algoritmo que hago desde la aplicación es el siguiente:
>
> for each (select distinct muestra_par = id_parte, muestra_alm = id_almacen,
> muestra_loc = id_localizacion from def_salinvmes)
>     select nuevovalor = valor
>     from def_salinvmes
>     where id_parte = muestra_par
>         id_almacen = muestra_alm
>         id_localizacion = muestra_loc
>     order by anno_salinvmes desc, mes_salinvmes desc
>     limit 1
>
>     update def_existloc
>     set valor = nuevovalor
>     where id_parte = muestra_par
>         id_almacen = muestra_alm
>         id_localizacion = muestra_loc
> end for each
>

No te conviene hacer lo asi?:
fo each (select distinct muestra_par = id_parte,
                       muestra_alm = id_almacen,
                       muestra_loc = id_localizacion
                       nuevovalor = valor
       from def_salivmes
       where id_parte = muestra_par
        id_almacen = muestra_alm
        id_localizacion = muestra_loc
       order by anno_salivmes desc, mes_salivmes desc)

    update def_existloc
    set valor = nuevovalor
    where id_parte = muestra_par
        id_almacen = muestra_alm
        id_localizacion = muestra_loc
 end for each


> un UPSERT pero no me gusta la idea de crear y borrar este trigger cada vez
> que se corre el proceso ya que no podría tenerlo "vivo" en la operación
> normal.

Es que si la regla ya esta activa... para que correr la actualizacion
nuevamente?

>
> Cualquier comentario es bienvenido.
>
> Atentamente,
>
> RAUL DUQUE
> Bogotáq, Colombia



--
     Emanuel Calvo Franco
       Sumate al ARPUG !
     (www.postgres-arg.org -
        www.arpug.com.ar)
   ArPUG / AOSUG Member
  Postgresql Support & Admin
--
TIP 4: No hagas 'kill -9' a postmaster

Responder a