On Thu, 7 Sept 2023 at 22:42, mauricio pullabuestan <jmaurici...@yahoo.es> wrote: > 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
Dejando aparte cosas de trigger, que ya te han comentado, lo primero que te recomendaria yo en un proceso tipo batch de estos. salvo que tengas un problema enorme de espacio, es limpiar los datos antes de seguir con el INSERT/UPDATE. Dejando aparte que esto le pueda ayudar al optimizador te hara mucho mas facil seguir el codigo. Lo que quiero decir es que si tras: > TRUNCATE item_bodega_pedidos_spp; > COPY item_bodega_pedidos_spp FROM '/home/pasa_vfp_pg/bodega_migra.csv' > DELIMITER ',' CSV HEADER; En lugar del > DELETE FROM item_bodega_pedidos_spp t > WHERE NOT EXISTS (SELECT 1 FROM items i Where i.item = t.item); Haces algo tipo: CREATE temporary table IBPS_temp AS SELECT t.item as item, , t.loctid as loctid , COALESCE(t.lsoaloc, 0) as lsoaloc , COALESCE(t.orderpt, 0) as orderpt , COALESCE(t.icacct, '') as icacct , COALESCE(t.rclacct, '') as rclacct , COALESCE(t.iclacct, '') as iclacct , COALESCE(t.gllink, '') as gllink , COALESCE(t.com_pedido, 0) as com_pedido FROM item_bodega_pedidos_spp t JOIN items i USING (item) y luego añadiria, tras crear los indices que necesite (PK? (aunque aqui no lo necesita porque estas copiando una que ya la tiene y no la tocas) ) un ANALYZE IBPS_temp; Que si la tabla es pequeña sera rapido, y le puede ayudar al optimizador. Esto es sobre todo cleanup generico, separar limpiezas ( coalesces, delete ) del proceso real ( update, insert), que ademas te ayuda a simplificar los queries posteriores y tener menos problemas con la logica realmente compleja, que siempre viene bien. Ademas ayuda al optimizador que ahora no tiene coalesces en los queries y puede ver mejor lo que se hace. Francisco Olarte.