¿Cuál es la forma más rápida de realizar una inserción masiva en Postgres? [cerrado]
Necesito insertar mediante programación decenas de millones de registros en una base de datos de Postgres. Actualmente, estoy ejecutando miles de declaraciones de inserción en una sola consulta.
¿Existe una mejor manera de hacer esto, alguna declaración de inserción masiva que no conozco?
PostgreSQL tiene una guía sobre cómo poblar mejor una base de datos inicialmente y sugiere usar el comando COPY para cargar filas de forma masiva. La guía tiene otros buenos consejos sobre cómo acelerar el proceso, como eliminar índices y claves externas antes de cargar los datos (y volver a agregarlos después).
Existe una alternativa al uso de COPY, que es la sintaxis de valores de varias filas que admite Postgres. De la documentación :
INSERT INTO films (code, title, did, date_prod, kind) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
El código anterior inserta dos filas, pero puede extenderlas arbitrariamente, hasta alcanzar la cantidad máxima de tokens de declaración preparados (puede que sean $999, pero no estoy 100% seguro de eso). A veces no se puede utilizar COPY y este es un sustituto digno para esas situaciones.
Una forma de acelerar las cosas es realizar explícitamente múltiples inserciones o copias dentro de una transacción (digamos 1000). El comportamiento predeterminado de Postgres es confirmar después de cada declaración, por lo que al agrupar las confirmaciones por lotes, puede evitar algunos gastos generales. Como dice la guía en la respuesta de Daniel, es posible que deba desactivar la confirmación automática para que esto funcione. También tenga en cuenta el comentario en la parte inferior que sugiere que aumentar el tamaño de wal_buffers a 16 MB también puede ayudar.