Sieben praktische Tipps zum Massenladen von Daten in PostgreSQL

Kostenlose Übersetzung des Artikels "7 Best Practice-Tipps für das Laden von PostgreSQL-Massendaten"



Manchmal ist es erforderlich, in wenigen einfachen Schritten eine große Datenmenge in die PostgreSQL-Datenbank zu laden. Diese Vorgehensweise wird üblicherweise als Massenimport bezeichnet, bei dem eine oder mehrere große Dateien als Datenquelle dienen. Dieser Prozess kann manchmal unannehmbar langsam sein. Es gibt mehrere Gründe für diese schlechte Leistung. Indizes, Trigger, Fremd- und Primärschlüssel oder sogar das Schreiben von WAL-Dateien können zu Verzögerungen führen.



In diesem Artikel finden Sie einige praktische Tipps zum Massenimport von Daten in PostgreSQL-Datenbanken. Es kann jedoch Situationen geben, in denen keine von ihnen eine wirksame Lösung für das Problem darstellt. Wir empfehlen den Lesern, die Vor- und Nachteile einer Methode zu prüfen, bevor sie angewendet wird.



Tipp 1. Versetzen Sie die Zieltabelle in den nicht protokollierten Modus



In PostgreSQL9.5 und höher kann die Zieltabelle in den nicht protokollierten Modus versetzt und nach dem Laden der Daten in den protokollierten Modus zurückgesetzt werden.



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 .





Der Massenimport von Daten für Datenbankanwendungen erfolgt nicht jeden Tag, beeinträchtigt jedoch die Abfrageleistung. Deshalb ist es unbedingt erforderlich, die Ladezeiten so weit wie möglich zu verkürzen. Eine Sache, die DBA tun kann, um die Möglichkeit von Überraschungen zu minimieren, ist die Durchführung einer Lastoptimierung in einer Testumgebung mit einem ähnlichen Server und PostgreSQL, das auf ähnliche Weise konfiguriert ist. Es gibt verschiedene Szenarien zum Laden von Daten, und es ist am besten, jede Methode auszuprobieren und eine auszuwählen, die gut funktioniert.




All Articles