Hola Horacio.
> Hola, >> On 7/09/2023, at 2:41 PM, mauricio pullabuestan <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 >Saca el explain plan, algo me dice que tu problema esta relacionado a un >indice de un trigger que esta generando un full scan. ( me paso en el pasado ). En estos momentos no es posible un explain, es muy pesados y el sistema se vuelve muy lento para los usuarios, el fin de semana voy a sacar explain del UPDATE e INSERT. >Favor de tirar las definiciones de las tablas relacionadas y los FK a los que >apuntan las otras tablas. >\d tabla1 >\d tabla2 >El final me dice información sobre los FK si es que existen. Estas son las tablas que son FK de la tabla bodega a la que estoy actualizando CREATE TABLE items ( item character varying(15) NOT NULL, descripcion character varying(100), clase_producto character varying(6), alterno1 character varying(15), unidad_medida character varying(6), costo_promedio numeric(11,5) NOT NULL DEFAULT 0, familia character varying(25), es_fabricado BOOLEAN, es_comprado BOOLEAN, es_fantasma BOOLEAN, CONSTRAINT pk_items PRIMARY KEY (item), CONSTRAINT items_indicadores_compatibles_chk CHECK (NOT (es_fabricado AND es_comprado) AND NOT (es_comprado AND es_fantasma)) ) CREATE TABLE id_bodegas ( bodega character varying(3) NOT NULL, descripcion character varying(60), ciudad character varying(20), lugar character varying(10), tipo_bodega character varying(10), ubicacion_default character varying(4), CONSTRAINT pk_id_bodegas PRIMARY KEY (bodega) ) >Lo otro, si hay posibilidad de hacer todo como SQL mucho mejor. >Si generas el CVS desde la misma base, tendría mas sentido hacer todas las >operaciones SQL. La generación del scv es de una aplicación aparte y viene de una tabla de visual foxpro Saludos. Mauricio > > 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; > >