2010-08-09 6 views
9

J'ai une structure de données qui ressemble à ceci:Comment importer des blocs de données * gigantesques * vers PostgreSQL?

Model Place 
    primary key "id" 

    foreign key "parent" -> Place 
    foreign key "neighbor" -> Place (symmetryc) 
    foreign key "belongtos" -> Place (asymmetric) 

    a bunch of scalar fields ... 

J'ai plus de 5 millions de lignes dans la table de modèle, et je dois insérer ~ 50 millions lignes dans chacune des deux tables clés étrangères. J'ai SQL fichiers qui ressemblent à ceci:

INSERT INTO place_belongtos (from_place_id, to_place_id) VALUES (123, 456); 

et ils sont sur le point 7 Gb chacun. Le problème est, quand je fais psql < belongtos.sql, il me faut environ 12 heures pour importer ~ 4 millions lignes sur mon CPU AMD Turion64x2. OS est Gentoo ~ amd64, PostgreSQL est la version 8.4, compilé localement. Le répertoire de données est un montage de liaison, situé sur ma deuxième partition étendue (ext4), qui, je crois, n'est pas le goulot d'étranglement. Je soupçonne qu'il faut si longtemps pour insérer les relations de clés étrangères parce que psql vérifie les contraintes de clé pour chaque ligne, ce qui ajoute probablement un surcoût inutile, car je sais avec certitude que les données sont valides. Y a-t-il un moyen d'accélérer l'importation, c'est-à-dire de désactiver temporairement le contrôle de contrainte?

+0

oui mais je pense que c'est seulement dans 8.4+ hmm faut le chercher .... – xenoterracide

Répondre

16
  1. Assurez-vous que les clés étrangères sont DEFERRABLE
  2. Utilisez COPY pour charger vos données
  3. Si vous ne pouvez pas utiliser le copier, utiliser un prepared statement pour votre INSERT.
  4. Les paramètres de configuration de Propper vous aideront également, vérifiez les paramètres WAL.
+4

+1 pour COPY, fait une énorme différence sur les DBs que je traverse de données régulièrement ... – Ryley

+0

J'utilise déjà DEFERRABLE. COPY est la chose que je cherchais, merci! –

+0

L'utilisation de reportable est une chose, l'utilisation réelle de cette option est une autre chose: INITIALEMENT DIFFERE ou SET CONTRAINTES TOUS DIFFERES; –

0

La réponse est oui ... Depesz wrote an article here on deferrable uniqueness. Malheureusement, il semble que ce soit une fonctionnalité de 9.0.

hmm ... Peut-être que cet article ne s'applique pas à votre situation? Il semble que nous avons été en mesure de set constraints to deferred pendant un certain temps ... Je suppose que cette situation unique est unique (jeu de mots).

+0

Les clés étrangères sont déjà reportables dans les anciennes versions, pas de problème. –

+0

Hey, apprendre quelque chose de nouveau tous les jours;). – xenoterracide

+0

L'article de Depesz décrit des contraintes * uniques * reportables (par exemple une clé primaire) qui n'étaient pas défendables avant 9.0 par ex. pour exécuter UPDATE id = id + 1 (où id est une colonne PK) Les contraintes FK régulières ont été "toujours" reportables. La définition de la contrainte reportable n'empêchera pas la vérification, elle ne fera que _delayer_ la vérification jusqu'à la fin de la transaction (c.-à-d. Lorsque la validation est exécutée) –

Questions connexes