2010-08-09 8 views
9

Ich habe eine Datenstruktur, die wie folgt aussieht:Wie importieren * riesige * Datenblöcke nach 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 ... 

Ich habe mehr als 5 Millionen Zeilen in der Modelltabelle, und ich brauche ~ 50 Millionen Reihen in jedem der beiden Fremdschlüsseltabellen einzufügen. Ich habe SQL Dateien, die wie folgt aussehen:

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

und sie sind über 7 Gb jeder. Das Problem ist, wenn ich psql < belongtos.sql tun, es nimmt mir über 12 Stunden~ 4.000.000 Reihen auf meinem AMD Turion64x2 CPU zu importieren. OS ist Gentoo ~ amd64, PostgreSQL ist Version 8.4, lokal kompiliert. Das Datenverzeichnis ist ein Bind Mount, das sich auf meiner zweiten erweiterten Partition befindet (ext4), was meiner Meinung nach nicht der Flaschenhals ist.

Ich vermute, dass es so lange dauert, die Fremdschlüsselrelationen einzufügen, weil psql nach den Schlüsseleinschränkungen für jede Zeile sucht, was wahrscheinlich unnötigen Overhead hinzufügt, da ich sicher weiß, dass die Daten gültig sind. Gibt es eine Möglichkeit, den Import zu beschleunigen, d. H. Die Constraint-Prüfung vorübergehend zu deaktivieren?

+0

ja, aber ich denke, es ist nur in 8.4+ hmm haben es nachzuschlagen .... – xenoterracide

Antwort

16
  1. Sicherstellen, dass beide Fremdschlüssel-Constraints DEFERRABLE sind
  2. Verwenden COPY Ihre Daten laden
  3. Wenn Sie nicht kopieren können, eine prepared statement für Ihre INSERT verwenden.
  4. Propper Konfigurationseinstellungen auch, überprüfen Sie die WAL Einstellungen helfen.
+4

+1 für COPY, einen großen Unterschied auf DBs macht ich auf, dass Einsatz Tonnen laufen von Daten regelmäßig ... – Ryley

+0

Ich benutze bereits DEFERRABLE. COPY ist die Sache, nach der ich gesucht habe, danke! –

+0

Verwenden von Aufschiebbar ist eine Sache, diese Option wirklich zu verwenden, ist eine andere Sache: INITIALLY DEFERRED oder SET CONSTRAINTS ALLE AUFMERKSAMKEIT; –

0

Die Antwort ist ja ... Depesz wrote an article here on deferrable uniqueness. leider scheint es ein 9.0 Feature zu sein.

hmm ... Vielleicht ist dieser Artikel nicht auf Ihre Situation zutreffen? Scheint, wir konnten set constraints to deferred für eine Weile ... Ich vermute, dass einzigartig ist eine einzigartige Situation (Wortspiel beabsichtigt).

+0

Fremdschlüssel in älteren Versionen bereits deferrable sind, kein Problem. –

+0

Hey, lerne jeden Tag etwas Neues;). – xenoterracide

+0

Der Artikel von Depesz beschreibt aufschiebbare * eindeutige * Einschränkungen (z. B. einen Primärschlüssel), die nicht vor 9,0 z. UPDATE ausführen ID = ID + 1 (ID ist eine PK-Spalte) Regelmäßige FK-Einschränkungen sind "immer" aufschiebbar. die Einschränkung Einstellung wird aufschiebbaren die Überprüfung nicht verhindern, es wird nur _delay_ die Prüfung bis zum Ende der Transaktion (dh wenn commit ausgeführt wird) –