Hola Jaime

<jmaurici...@yahoo.es> wrote:
>>
>> Buenas tardes.
>>
>> Tengo una aplicación que corro en la madrugada, crea un archivo *.scv a 
>> partir de una tabla de Visual Foxpro (1400000 registros)  un directorio en 
>> Ubuntu y luego ejecuta una función en postgres que  copia los datos del 
>> archivo scv a una tabla UNLOGGED  en Postgresql 9.6, para luego actualizar e 
>> insertar en una tabla de producción, el problema que tengo es que todo el 
>> proceso toma alrededor de 100 minutos, de los cuales el UPDATE toma más  99% 
>> del tiempo, las 2 tablas tienen como llave campos bodega, ítem con el mismo 
>> tipo y longitud
>>
>> Necesito optimizar este proceso
>>
>> Cuál es el riesgo de desactivar un trigger y luego de procesar volverlo a 
>> activar, sabiendo que no tiene incidencia dentro de este proceso y la 
>> concurrencia es mínima.
>>

<Si usas ALTER TABLE DISABLE TRIGGER USER, no hay riesgo... siempre que
sepas que el trigger no hace nada importante

Entonces sin importar el grado de concurrencia, los puedo desactivar, ya que el 
update de estos campos no son importantes que estén activos.



>>
>> Trigger
>>
>> 1 trigger de auditoria para Insert, Edit, Delete, crea un registro en una 
>> tabla con datos de los cambios.
>>
>> 2 trigger por truncate
>>
>> 3 trigger por delete que verifica que no tenga existencia u ordenes
>>
>> 4 trigger before por Insert, llena algunos campos con un par de select a 
>> tablas muy pequeñas
>>
>> 5 trigger after por trigger que inserta en un registro en una tabla.
>>

>aunque aqui mencionas varios triggers, sobre que tabla están estos
triggers? el 5to es sobre UPDATE?


Los triggers, pertenecen a la tabla bodegas, el 5to. trigger es por Insert 
after.


>>
>>
>> CREATE UNLOGGED TABLE data_igualar.item_bodega_pedidos_spp
>> (
>>  item character varying(15) NOT NULL,
>>  loctid character varying(3) NOT NULL,
>>  lsoaloc numeric(12,3),
>>  orderpt numeric(12,3),
>>  icacct character varying(24),
>>  rclacct character varying(24),
>>  iclacct character varying(24),
>>  gllink character varying(3),
>>  com_pedido numeric(10,3),
>>  CONSTRAINT item_bodega_pedidos_spp_pkey PRIMARY KEY (loctid, item)
>> )
>>

>aqui yo crearía un índice sobre item para ayudar al DELETE que haces
justo después del COPY

Lo voy a crear.


>>
>> Función
>>
>> CREATE FUNCTION item_bodega_fvp_pg()
>> RETURNS void AS
>> $BODY$
>>
>> BEGIN
>>
>> SET work_mem = '500MB';
>> TRUNCATE item_bodega_pedidos_spp;
>> COPY item_bodega_pedidos_spp FROM '/home/pasa_vfp_pg/bodega_migra.csv' 
>> DELIMITER ',' CSV HEADER;
>>
>> DELETE FROM item_bodega_pedidos_spp t
>>
>>  WHERE NOT EXISTS (SELECT 1 FROM items i Where i.item = t.item);
>>
>>
>> -- ALTER TABLE bodegas DISABLE TRIGGER USER;
>> UPDATE bodegas b
>>    Set pedidos_clientes      = COALESCE(t.lsoaloc, 0)
>>      , buffer                                        = COALESCE(t.orderpt, 0)
>>      , comprometido_pedido = COALESCE(t.com_pedido, 0)
>>  FROM ditem_bodega_pedidos_spp t
>>  WHERE (b.bodega, b.item) = (t.loctid, t.item);
>>
>> -- ALTER TABLE bodegas ENABLE TRIGGER USER;
>>
>>
>> /* registros insertados son muy esporádicos */
>>
>> INSERT INTO bodegas
>> ( item, bodega, pedidos_clientes, buffer, cuenta_inventarios, 
>> cuenta_compras, cuenta_ajuste
>> , codigo_integracion, comprometido_pedido)
>> Select
>>  t.item, t.loctid, COALESCE(t.lsoaloc, 0), COALESCE(t.orderpt, 0), 
>>COALESCE(t.icacct, ''), COALESCE(t.rclacct, ''), COALESCE(t.iclacct, '')
>> , COALESCE(t.gllink, ''), COALESCE(t.com_pedido, 0)
>> From item_bodega_pedidos_spp t
>>      Where NOT EXISTS( Select 1
>>                                          From bodegas b
>>                                            WHERE (b.bodega, b.item) = 
>>(t.loctid, t.item));
>>
>> TRUNCATE item_bodega_pedidos_spp;
>> RESET work_mem;
>>
>> END;
>>
>> $BODY$
>>  LANGUAGE plpgsql VOLATILE
>>  COST 100;
>>

>un explain analyze de los UPDATE e INSERT dentro de la función sería
>interesante. puedes obtenerlos usando auto_explain o puedes ponerlos
>en una sentencia preparada y sacar el explain de la sentencia
>preparada. algo así:

>"""
>prepare foo as

>UPDATE bodegas b
>    Set pedidos_clientes      = COALESCE(t.lsoaloc, 0)
>      , buffer                                        = COALESCE(t.orderpt, 0)
>      , comprometido_pedido = COALESCE(t.com_pedido, 0)
>  FROM ditem_bodega_pedidos_spp t
>  WHERE (b.bodega, b.item) = (t.loctid, t.item);


>explain analyze execute foo;
>"""

El proceso es pesado voy a sacar el explain el fin de semana.

Gracias


Reply via email to