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.


Reply via email to