Siete consejos prácticos para la carga masiva de datos en PostgreSQL

Traducción gratuita del artículo "7 consejos de mejores prácticas para la carga masiva de datos de PostgreSQL"



A veces es necesario cargar una gran cantidad de datos en la base de datos de PostgreSQL en unos simples pasos. Esta práctica se conoce comúnmente como importación masiva, donde uno o más archivos grandes sirven como fuente de datos. Este proceso a veces puede ser inaceptablemente lento. Hay varias razones para este bajo rendimiento. Los índices, los disparadores, las claves externas y primarias o incluso la escritura de archivos WAL pueden provocar retrasos.



En este artículo, proporcionaremos algunos consejos prácticos para la importación masiva de datos en bases de datos PostgreSQL. Sin embargo, puede haber situaciones en las que ninguno de ellos sea una solución eficaz al problema. Animamos a los lectores a considerar las ventajas y desventajas de cualquier método antes de aplicarlo.



Consejo 1. Poner la tabla de destino en modo no registrado



En PostgreSQL9.5 y versiones posteriores, la tabla de destino se puede configurar en modo no registrado y volver al modo registrado después de cargar los datos.



ALTER TABLE <target table> SET UNLOGGED;
<bulk data insert operations…>
ALTER TABLE <target table> LOGGED;


, PostgreSQL (WAL). . , , PostgreSQL . PostgreSQL .



, – . . , , , .



:



  • c ;
  • ;
  • , , .


2.



. , , .



, -, , . , , , , .



DROP INDEX <index_name1>, <index_name2> … <index_name_n>
<bulk data insert operations…>
CREATE INDEX <index_name> ON <target_table>(column1, …,column n)


maintenance_work_mem. .



, . : . , , .



3.



, , – , . PostgreSQL .



, , . , , , .



ALTER TABLE <target_table> 
    DROP CONSTRAINT <foreign_key_constraint>;
BEGIN TRANSACTION;
    <bulk data insert operations…>
COMMIT;
ALTER TABLE <target_table> 
    ADD CONSTRAINT <foreign key constraint>  
    FOREIGN KEY (<foreign_key_field>) 
    REFERENCES <parent_table>(<primary key field>)...;


, maintenance_work_mem .



4.



INSERT DELETE ( ) . , , , .



, . , .



ALTER TABLE <target table> DISABLE TRIGGER ALL;
<bulk data insert operations…>
ALTER TABLE <target table> ENABLE TRIGGER ALL;


5. COPY



PostgreSQL – COPY . COPY . , INSERT INSERT- VALUE



COPY <target table> [( column1>, … , <column_n>)]
    FROM  '<file_name_and_path>' 
    WITH  (<option1>, <option2>, … , <option_n>)


COPY:



  • , , ;
  • ;
  • ;
  • WHERE.


6. INSERT VALUE



INSERT – . , INSERT , , WAL.



INSERT VALUE .



INSERT INTO <target_table> (<column1>, <column2>, …, <column_n>) 
VALUES 
    (<value a>, <value b>, …, <value x>),
    (<value 1>, <value 2>, …, <value n>),
    (<value A>, <value B>, …, <value Z>),
    (<value i>, <value ii>, …, <value L>),
    ...;


INSERT VALUES . .



, , , PostgreSQL INSERT VALUES. INSERT, RAM , .



effective_cache_size 50%, shared_buffer 25% . , , INSERT VALUES, 1000 .



7. ANALYZE



, ANALYZE . , , . , . ANALYZE .





La importación masiva de datos para aplicaciones de bases de datos no ocurre todos los días, pero afecta el rendimiento de las consultas. Por eso es imperativo reducir al máximo los tiempos de carga. Una cosa que DBA puede hacer para minimizar la posibilidad de sorpresas es realizar optimizaciones de carga en un entorno de prueba con un servidor similar y PostgreSQL configurado de manera similar. Existen diferentes escenarios para cargar datos, y sería mejor probar cada método y elegir uno que funcione bien.




All Articles