Traduction gratuite de l'article "7 meilleures pratiques pour le chargement de données en masse PostgreSQL"
Parfois, il devient nécessaire de charger une grande quantité de données dans la base de données PostgreSQL en quelques étapes simples. Cette pratique est communément appelée importation en bloc, où un ou plusieurs fichiers volumineux servent de source de données. Ce processus peut parfois être d'une lenteur inacceptable. Plusieurs raisons expliquent cette mauvaise performance. Les index, les déclencheurs, les clés étrangères et primaires, ou même l'écriture de fichiers WAL peuvent entraîner des retards.
Dans cet article, nous fournirons quelques conseils pratiques pour l'importation en masse de données dans des bases de données PostgreSQL. Cependant, il peut y avoir des situations où aucun d'entre eux ne constitue une solution efficace au problème. Nous encourageons les lecteurs à considérer les avantages et les inconvénients de toute méthode avant de l'appliquer.
Astuce 1. Mettre la table cible en mode non journalisé
Dans PostgreSQL9.5 et versions ultérieures, la table cible peut être définie en mode non journalisé et remise en mode journalisé après le chargement des données.
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 .
L'importation en masse de données pour les applications de base de données ne se produit pas tous les jours, mais elle affecte les performances des requêtes. C'est pourquoi il est impératif de réduire au maximum les temps de chargement. Une chose que DBA peut faire pour minimiser la possibilité de surprises est d'effectuer une optimisation de la charge dans un environnement de test avec un serveur similaire et PostgreSQL configuré de la même manière. Il existe différents scénarios de chargement des données et il serait préférable d'essayer chaque méthode et d'en choisir une qui fonctionne bien.