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;