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.

Anticipo mis agradecimientos

Mauricio

Tablas

CREATE TABLE bodegas   /*la tabla es mucho más ancha*/

(

  bodega character varying(3) NOT NULL,
  item character varying(15) NOT NULL,
  buffer numeric(12,3) DEFAULT 0,
  pedidos_clientes numeric(12,3) DEFAULT 0,
  comprometido_pedido numeric(10,3) DEFAULT 0,
  CONSTRAINT pk_bodegas PRIMARY KEY (bodega, item),
  CONSTRAINT fk_bodegas_id_bodegas FOREIGN KEY (bodega)
  REFERENCES id_bodegas (bodega) MATCH FULL
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_bodegas_item FOREIGN KEY (item)
      REFERENCES items (item) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

CREATE INDEX idx_bodegas_bodega_fecha
  ON bodegas
  USING btree
  (bodega COLLATE pg_catalog."default", fecha_conteo);
CREATE INDEX idx_bodegas_item_bodega
  ON bodegas
  USING btree
  (item COLLATE pg_catalog."default", bodega COLLATE pg_catalog."default");

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.

 

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)
)

 
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;


Reply via email to