creo que si no cambiaste nada como triggers e indices deberias pensar en
que cambio algun plan de ejecucion de la consulta.
De ser asi tendrias que hacer un explain plan y verificar si podes
agregar algun indice o cambiar algo en la consulta que mejore su
performance.
saludos.

El mar, 12-06-2012 a las 14:42 -0500, [email protected] escribió:

> Estimada Lista,
> 
> Tengo un problema con PostgreSQL, desde el día de ayer. Tengo 4 bases  
> de datos que en principio estuvieron corriendo sobre la versión 8.3 en  
> windows 2003 server, sin problemas desde hace poco mas de 3 años.
> 
> Sin embargo, luego de agregar una nueva base de datos, se presentaron  
> problemas al momento de actualizar saldos y grabar movimientos en 3  
> tablas.
> 
> Tengo una función que realiza esta tarea (actualzar saldos x articulo,  
> grabar movimientos y actualizar lotes disponibles x articulo).
> 
> Por cada pedido realizado, llamo a esta función para que actualice3  
> tablas. Antes de ayer, este proceso no demoraba ni dos segundos en  
> procesar. Ahora demora demasiado (6'500,000ms) y aun no termina de  
> procesar 2305 registros.
> 
> He instalado la ultima versión de PostgreSQL y he levantado las BDs  
> sin problema, puedo consultar cualquier tabla de forma normal, pero no  
> puedo procesar ninguna actualización sobre éstas.
> 
> Tengo un servidor HP ML150 con disco sata de 500GB memoria de 4GB y  
> porcesador Xeon de 4 nucleos. Todo corriendo sobre Windows 2003 server.
> 
> El código que ejecuto es:
> -------------------------
> FOR reg_pedidos IN SELECT
>              a.cod_producto
>            , a.cantidad
>            , b.fecha_emision
>        FROM
>              detalle_pedidos a
>            , pedidos b
>        WHERE a.empresa = v_empresa
>          AND a.sucursal = v_sucursal
>          AND a.pedido = v_interno
>          AND a.procesado
>          AND NOT a.anulado
>          AND b.empresa = a.empresa
>          AND b.sucursal = a.sucursal
>          AND b.pedido = a.pedido
>        LOOP
>        RAISE NOTICE 'Producto > %',reg_pedidos.cod_producto;
>        RAISE NOTICE 'Actualizando saldos_online';
>           UPDATE saldos_online
>              SET saldo_apto = saldo_apto - reg_pedidos.cantidad,
>                  ultima_salida = reg_pedidos.cantidad
>            WHERE empresa = v_empresa
>              AND sucursal = v_sucursal
>              AND cod_producto = reg_pedidos.cod_producto;
>           RAISE NOTICE 'Actualizando detalle_pedidos';
>           UPDATE detalle_pedidos
>              SET      procesado = false
>            WHERE empresa = v_empresa
>              AND sucursal = v_sucursal
>              AND pedido = v_interno
>              AND cod_producto = reg_pedidos.cod_producto;
>           RAISE NOTICE 'Actualizando pedidos';
>           UPDATE pedidos
>              SET      procesado = false
>            WHERE empresa = v_empresa
>              AND sucursal = v_sucursal
>              AND pedido = v_interno;
>           RAISE NOTICE 'Anulando movi_prod';
>        UPDATE movi_prod
>              SET anulado = true
>            WHERE empresa = v_empresa
>              AND sucursal = v_sucursal
>              AND tipo_doc = 90
>              AND serie_doc = 1
>              AND numero_doc = v_interno;
>        RAISE NOTICE 'Actualizar vencimientos';
>        FOR reg_lotes IN SELECT
>                a.lote
>              , a.vencimiento
>              , a.cantidad
>           FROM
>                mov_vencimientos a
>           WHERE a.empresa = v_empresa
>             AND a.sucursal = v_sucursal
>             AND a.cod_movimiento = v_movimiento
>             AND a.pedido = v_interno
>             AND a.cod_producto = reg_pedidos.cod_producto
>           LOOP
>              UPDATE vencimientos
>                 SET saldo_final_apto = saldo_final_apto - reg_lotes.cantidad
>               WHERE empresa = v_empresa
>                 AND sucursal = v_sucursal
>                 AND cod_producto = reg_pedidos.cod_producto
>                 AND vencimiento = reg_lotes.vencimiento
>                 AND lote = reg_lotes.lote;
>           END LOOP;
>           DELETE FROM mov_vencimientos
>           WHERE empresa = v_empresa
>             AND sucursal = v_sucursal
>             AND cod_movimiento = v_movimiento
>             AND pedido = v_interno;
>        END LOOP;
> -----------------------
> 
> Por favor, que información debo proporcionarles para que me puedan  
> orientar y corregir este problema.
> 
> Desde ya les agradezco por su atención a la presente.
> 
> Saludos,
> 
> Marcos Ríos Rodríguez
> Arequipa-Perú.
> 
> -
> Enviado a la lista de correo pgsql-es-ayuda ([email protected])
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a