From: | mauricio pullabuestan <jmauriciopb(at)yahoo(dot)es> |
---|---|
To: | Postgres ayuda <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Optimizar Update |
Date: | 2023-09-07 20:41:59 |
Message-ID: | 3245331.9002363.1694119319123@mail.yahoo.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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;
From | Date | Subject | |
---|---|---|---|
Next Message | Horacio Miranda | 2023-09-07 21:06:49 | Re: Optimizar Update |
Previous Message | Fernando Monjes | 2023-08-23 14:44:51 | Re: Problema de upgrade postgresql RDS con las réplicas lógicas |